最近一個跟軍事有關的主要新聞,就是我們的IDF升級計畫,翔昇計畫完成,儘管看起來還需要一段不短的時間進行驗證,但出廠的樣式看來不錯。
身為男性,往往都會對強悍、高科技的裝置有興趣,而軍事武器往往是其中之一,不過在大家熱烈討論的時候,往往都會非常自動的將它的用途(殺人)略過,儘管如此,大家還是樂此不疲的討論。
我個人覺得,近40年來,歐美最成功的東西就是電腦,單單靠電腦,就不知道讓歐美(尤其是美國)擁有多少不可數的優勢,美國是一個非常幸福的國家,它的國土面積是全世界第三大的,但是人口只有3億人,中國比它大,但是人口有12億,而且西半部一大塊都是荒地、高山,根本不能開發,不過因為美國的這種特性,他們有更多自動化的需求,也比其他國家更講人權,人少當然人命寶貴,換做中國,死一票又如何,人這麼多~
因為如此,電腦對美國有特別重要的需求,能夠利用電腦節省一個人力,就是非常不錯的投資,能節省許多人力,成本上升一倍也值得,同樣的話在中國顯然不這麼適用,一件事情一個人做不完,那就10個吧~
而電腦,這真是強大的工具阿~舉個有趣的例子,之前看過忘了是Discovery還是網路的消息,東西德統一後,他們第一件事情就是拿米格29和F-16進行纏鬥,看看誰強~
有趣的事情出現了,米格29的氣動力表現和引擎能量沒話說,就是比F-16強大,我相信這裡指的是,當需要瞬間能量時,米格29可以做出非常優異的動作,引擎能提供瞬間強大的力量,而飛機氣動力優良,能讓動作做出來~
相比之下,F-16的迴轉力不錯,靈活度也不錯,但是對於大角度的動作,它沒辦法像米格29這麼強悍,結論是,就整個機構來說,米格29是很強的。
然而有趣的事情出現了,米格29的駕駛艙,搖桿的正後方有個大大的時鐘,其他部份則很多都是開關,這時候飛行員解釋說,米格29在飛彈的發射,非常需要看時鐘,因為米格29的電腦僅僅只會幫你瞄準,不會告訴你多久後會命中,也不會告訴你是不是在射程之內,而如果是紅外線導引或半主動雷達導引的飛彈,需要戰鬥機提供鎖定的資訊,那麼這時候飛行員只能看著時鐘自己倒數,雖然這看起來不這麼重要,但是在戰鬥時分秒必爭的環節,對於「人的多工」就有了決定性的差異。
至於F-16,在它一推出之時,就是以優異的電線傳導取代油壓,搭配優秀的射控、電控電腦著稱的,它的電腦會主動瞄準,並顯示距離和預計的命中時間,飛行員只要看看時間,評估一下就可以決定要攻擊的目標了,兩相比較,誰強誰弱很清楚。
我們的IDF,很多人說它很破爛,可是事實上,和其他國家的戰機相比,並不遜色,IDF最讓人詬病的就是引擎,因為拿不到大引擎,因此用了小引擎,但是如果去漢祥網站看,我們的引擎可是全數位化的,而且是全自製的,我們有完整的設計圖,要提昇性能,在一定的性能提昇上(10%上下)並不會困難到需要很大的代價。
相比來看看其他國家,日本的沒話說,他們本身就有F-1戰機的設計能力,F-2戰機對他們來說,他們要的是F-15的能力(重型戰機,也就是掛彈量大,Power強),美國一樣限制他們,強迫他們只能參考F-16來設計(F-16是輕型戰機),結果它們搞了個F-16的威力加強版。
至於韓國呢?韓國的K-50,改名後叫做黃金鷹,可以去維基百科看看,它的引擎只用一顆,推力並不如我們兩顆的推力,意思是,IDF還比黃金鷹強些些。
而雷達,大家都說我們的GD-53是垃圾,可是我們的GD-53和韓國一樣,是APG-67雷達改的(至少我們還有改良,韓國直接套用,未來可否更新也許是問題),至於日本,人家的三菱重工自己就有能力做出強力雷達,當然不屑美國的幫助,美國也沒理由強迫他們用顆搜尋能力差的雷達。
看看IDF之前的開發,當時的電腦系統(電控、射控系統)是由英國航太系統公司(BAE Systems)直接提供的,說起來也合理,當時又沒有相關的技術。
雷達系統則是拿APG-67改的,看起來應該是把對地攻擊的部份拿掉了。
加上給顆性能不夠好的引擎,因此飛機就做不大,油箱也不能放多,設計就受限了。
這次的翔昇計畫,主要是修改電腦系統,但是也加了油箱,而且一開始我以為是掛在下面,發現不是,是整合進飛機裡面,增加了「飛機內部」的油箱空間,這很直覺就可以聯想,下一步就是提昇引擎性能了,不然加個油箱在「飛機裡面」幹嘛~
而電腦系統就更炫了,從原本BAE使用的16位元1750 CPU改成32位元的,這個16位元處理器,八成是顆DSP處理器,就一些看到的討論,有人說到「不過就是16位元CPU加上40位元的浮點運算器」,這八九不離十就是DSP處理器了,雖然不差,可是的確不能適用在新一代的應用場合。
這次找BAE換CPU,直接換成了32位元的PowerPC處理器,也換了顯示器,換成全彩的,而且以現在這個時間點來看,八成是全彩觸控式液晶螢幕。
這樣的修改,讓IDF變成全數位化的戰機,而32位元的電腦系統,最直接的影響就是可以使用OS(16位元不是沒有OS,但OS主流還是在32位元上),這讓程式開發容易許多,要在上面開發個MP3播放程式我都不意外,而且將開發簡化後,我們能夠進一步開發許多應用程式,像是飛機間通訊,情報交換,甚至上面有TCP/IP可以上網我都不意外。
這樣的改變是很棒的,這讓IDF成為我們的主力戰機,至少不會被美國綁著,賣個爛F-16 A/B,F-16 A/B還是類比系統耶,而且程式設計、系統整合都要看別人臉色,花錢做到,明明就只是protocol的問題罷了,不賣就是沒辦法開發。
整體來看,我個人是覺得做得很不錯的說,尤其自己又是玩電腦的,加強電腦很直覺可以想得到有非常多的好處,而且未來的開發無可限量,一個搞不好,說不定上面跑的還是WinCE勒~
不過近日注意新聞,發現官員對它似乎不特別有興趣,頂多只想靠它買到F-16 C/D。
想一想,如果靠漢翔讓軍購變便宜,也許整體算起來,合算當然是買軍購,可是,軍購的背後每次都靠他們開發,也沒有因為軍購後補助他們,這擺明就是美國不讓台灣有自主國防,然後說些沒決心之類的風涼話。
所以是否應該想想升級的必要性,還是其實大家打的主意是兩者並進,嫌錢太多,我相信大家都不會有意見的~
最後提一下,避免造成誤會,竊取國防機密之類的,資料來源全部都是網路:
維基百科(http://en.wikipedia.org/wiki/AIDC_F-CK_Indigenous_Defence_Fighter)及其外部連結
近日新聞
戰國時代討論區(ArtOfWar)-漢翔改良IDF 雙十節首飛~(http://artofwar.homeip.net/bboard/viewtopic.php?t=6125&postdays=0&postorder=asc&start=0&sid=c77c8303a543bb4779668ddd0a75ec27)及其外部連結
google
2007年3月28日
2007年3月26日
台灣首位本土圍棋王與教育
很早前就說過,台灣教育實在失敗~
我不在意教改,那種把小學生課本改來改去的教改,在這點是,唯一有意見的,大概是政治涉入吧~
可是這次的圍棋王、棋靈王,我卻很有意見了~
台灣號稱自由、民主,可是什麼都沒有,政府沒為人做過什麼,我是個學生,至少目前還是,其實沒資格說什麼政府為人民做什麼的大話,畢竟連稅金、健保金都要我爸繳的人,沒資格說這種話。
但是有一點我非常的感同身受,那就是教育的缺失。
我不瞭解什麼叫做成功的教育,可是一直以來,我一直一直認為台灣的學校和業界脫勾嚴重,十幾年前,台灣PC GAME遊戲興盛,還記得軟體世界雜誌每次都介紹著國內外遊戲軟體公司,也不斷的說國內遊戲軟體公司缺人,十幾年後,儘管許多遊戲軟體公司倒的倒,轉型的轉型,但是缺人風依舊,讓我們想想,遊戲軟體的產生,需要多少人,需要哪些技能的專業?只是簡單的程式設計師嗎?
一套遊戲軟體,從規劃、設計、寫遊戲、包裝、行銷,每個程序都需要專業人員,規劃需要企劃人員,設計故事需要作家、美工、美術設計,寫遊戲需要程式設計師、包裝和行銷需要企管,中間還有專案管理員之類的人,而現在線上遊戲熱門,線上遊戲公司甚至還需要日文、韓文的翻譯。
這些每個環節都是專業,這些專業的人員從哪裡來?難道從石頭蹦出來嗎?當然是學校阿~
可是看看,現在的學校都是些什麼科系?有跟遊戲軟體相關的嗎?
再看看這次的世界棋王,我們姑且叫他棋靈王吧~
他念的是什麼班級?什麼學校?是體育專班耶~
請問他下圍棋,跟跳高、跳遠、100公尺短跑、馬拉松長跑、游泳有什麼關係?
卻因為一般學校的課程跟不上轉念體育專班,而在台灣,這樣的例子比比皆是。
大陸落後,可是他們在上海成立了棋藝學校,也廣設軟體學院,這些學校的建設,持續發展下去,任何人看起來,至少未來20年開花結果了,可以帶出多少這些專業領域的人才?
我們號稱自由、民主,結果只是在搞三隻小豬是不是成語,在搞小學歷史課本,真正有用的是教育改革是什麼?
台灣普遍存在升學是唯一的路,一直以來根深蒂固,但是在這同時,我們經常看到許多專業的人在特定學校的特定班級努力發光,像調酒、跳水、這次的圍棋、電玩比賽、漫畫、歌唱。
這些有些是在特定班級,由「某位」專業老師努力的培育著,希望學生能成為所謂的「台灣之光」。
有許多是平常上課所學,和自己努力的專業毫無關係,每天去上學不知道為了什麼,成績不好,還會聯絡家長,說著你小孩如何不讀書、不努力,但是,讀書跟成功是劃上等號的嗎?
我們號稱的自由,是這樣的自由嗎?是限制發展的自由嗎?
為什麼不能為這些特殊項目成立特殊的學院或學校呢?
什麼叫做專業?當某個事物,不斷不斷的鑽研,不斷不斷的研究,當經驗累積到了某個程度,它就是專業,這一點,日本比我們成功很多很多~
在我們看來,看著日本人贏了某某獎項,一群人抱著痛哭,一群人喊著萬歲,就算只是微不足道的獎項,還是跟瘋子一樣的拼命,這看來很愚蠢。
但一堆人拼了命的研究,努力把它用各種莫名其妙的歸類法、經驗法則把它專業化,最後打敗了全世界的人,而且立於不敗之地之後,這些愚蠢會變成可怕的實力。
試問,我們在哪裡?我們只會在出現王建民時,稱讚的台灣之光,出現棋靈王時,稱讚台灣之光,但是政府有正視這些不斷挑戰自己的人嗎?只有和他們照照相、沾沾光、送個獎章,可是真正要做的,應該是正視這些人,在給予鼓勵的同時,創辦學校、學院、給予補助,或者僅僅只要新增法令,新增規範,這些做不到嗎?
看著記者問行政院長,說到棋靈王沒有接受到任何政府補助和培訓,他的回答很妙「這可以用特例申請」,特例申請,有多少人申請過?看不看學校成績?評判標準?真是十足的官腔~
我不在意教改,那種把小學生課本改來改去的教改,在這點是,唯一有意見的,大概是政治涉入吧~
可是這次的圍棋王、棋靈王,我卻很有意見了~
台灣號稱自由、民主,可是什麼都沒有,政府沒為人做過什麼,我是個學生,至少目前還是,其實沒資格說什麼政府為人民做什麼的大話,畢竟連稅金、健保金都要我爸繳的人,沒資格說這種話。
但是有一點我非常的感同身受,那就是教育的缺失。
我不瞭解什麼叫做成功的教育,可是一直以來,我一直一直認為台灣的學校和業界脫勾嚴重,十幾年前,台灣PC GAME遊戲興盛,還記得軟體世界雜誌每次都介紹著國內外遊戲軟體公司,也不斷的說國內遊戲軟體公司缺人,十幾年後,儘管許多遊戲軟體公司倒的倒,轉型的轉型,但是缺人風依舊,讓我們想想,遊戲軟體的產生,需要多少人,需要哪些技能的專業?只是簡單的程式設計師嗎?
一套遊戲軟體,從規劃、設計、寫遊戲、包裝、行銷,每個程序都需要專業人員,規劃需要企劃人員,設計故事需要作家、美工、美術設計,寫遊戲需要程式設計師、包裝和行銷需要企管,中間還有專案管理員之類的人,而現在線上遊戲熱門,線上遊戲公司甚至還需要日文、韓文的翻譯。
這些每個環節都是專業,這些專業的人員從哪裡來?難道從石頭蹦出來嗎?當然是學校阿~
可是看看,現在的學校都是些什麼科系?有跟遊戲軟體相關的嗎?
再看看這次的世界棋王,我們姑且叫他棋靈王吧~
他念的是什麼班級?什麼學校?是體育專班耶~
請問他下圍棋,跟跳高、跳遠、100公尺短跑、馬拉松長跑、游泳有什麼關係?
卻因為一般學校的課程跟不上轉念體育專班,而在台灣,這樣的例子比比皆是。
大陸落後,可是他們在上海成立了棋藝學校,也廣設軟體學院,這些學校的建設,持續發展下去,任何人看起來,至少未來20年開花結果了,可以帶出多少這些專業領域的人才?
我們號稱自由、民主,結果只是在搞三隻小豬是不是成語,在搞小學歷史課本,真正有用的是教育改革是什麼?
台灣普遍存在升學是唯一的路,一直以來根深蒂固,但是在這同時,我們經常看到許多專業的人在特定學校的特定班級努力發光,像調酒、跳水、這次的圍棋、電玩比賽、漫畫、歌唱。
這些有些是在特定班級,由「某位」專業老師努力的培育著,希望學生能成為所謂的「台灣之光」。
有許多是平常上課所學,和自己努力的專業毫無關係,每天去上學不知道為了什麼,成績不好,還會聯絡家長,說著你小孩如何不讀書、不努力,但是,讀書跟成功是劃上等號的嗎?
我們號稱的自由,是這樣的自由嗎?是限制發展的自由嗎?
為什麼不能為這些特殊項目成立特殊的學院或學校呢?
什麼叫做專業?當某個事物,不斷不斷的鑽研,不斷不斷的研究,當經驗累積到了某個程度,它就是專業,這一點,日本比我們成功很多很多~
在我們看來,看著日本人贏了某某獎項,一群人抱著痛哭,一群人喊著萬歲,就算只是微不足道的獎項,還是跟瘋子一樣的拼命,這看來很愚蠢。
但一堆人拼了命的研究,努力把它用各種莫名其妙的歸類法、經驗法則把它專業化,最後打敗了全世界的人,而且立於不敗之地之後,這些愚蠢會變成可怕的實力。
試問,我們在哪裡?我們只會在出現王建民時,稱讚的台灣之光,出現棋靈王時,稱讚台灣之光,但是政府有正視這些不斷挑戰自己的人嗎?只有和他們照照相、沾沾光、送個獎章,可是真正要做的,應該是正視這些人,在給予鼓勵的同時,創辦學校、學院、給予補助,或者僅僅只要新增法令,新增規範,這些做不到嗎?
看著記者問行政院長,說到棋靈王沒有接受到任何政府補助和培訓,他的回答很妙「這可以用特例申請」,特例申請,有多少人申請過?看不看學校成績?評判標準?真是十足的官腔~
2007年3月23日
SSH Tunnel心得
剛打的,也就沒什麼前言了,直接看囉~
=============================================================
SSH Tunnel心得:
一直以來都知道SSH其實只是一個加密的Tunnel,本身不像telnet只有提供終端機服務,
但是對SSH的Tunnel並沒有很大的興趣去玩它,又或者說其實是不會玩~
前陣子原本因為PSPad不支援sftp,因此用了一套「Bitvise Tunnelier」的軟體,
它能提供SFTP-FTP的功能,讓PSPad可以透過它連上SFTP機器,
此外,它也有Socks Tunnel的功能,讓我覺得非常方便~
無奈Bitvise Tunnelier需要在右下角有個圖示,而且Linux上不能用,
要做壞事就因此受限了,因此在研究有沒有程式可以做到Socks Tunnel的功能,
又可以跑在背景的~
答案是PuTTY和所屬的plink(PuTTY Link),以下是使用法。
PuTTY作法:
首先從最基本的PuTTY使用法介紹起,要用PuTTY來幫你做SSH Tunnel很簡單,
如下面這篇的作法:
http://www.pumb.org/viewthread.php?tid=155&fpage=1&highlight=
簡單的說,就是按照一般PuTTY使用,填入「Host Name(or IP address)」和「Port」,
接著點選左邊「Connection」->「SSH」->「Tunnels」
接著在「Source port」填入「1080」(你喜歡的port),
點選「Dynamic」,之後按下「Add」
之後按正常方式連線,放著即可~~
PuTTY Link(plink)作法:
PuTTY雖然方便,可是它要開個討厭的視窗,可以不要嗎?
答案就是plink。
首先到PuTTY的網站下載plink.exe,網址如下:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
下面先給個範例:
plink -D 1080 -N -pw ooxx user@xxx.xxx.xxx.xxx
plink其實就是PuTTY的指令版,沒有圖形化的選單,也沒有ANSI支援,但是它有PuTTY的連線能力。
我們會用到的幾個參數介紹如下:
-D Dynamic SOCKS-based port forwarding(其實就是PuTTY點選的「Dynamic」,後面填上喜歡的port
-N don't start a shell/command (SSH-2 only)(雖然僅支援SSH2,但這不是問題,它的功能是不要開啟討厭的SHELL)
-pw 你的SSH密碼
user@xxx.xxx.xxx.xxx 你SSH的帳號和SSH Server的IP
測試後可以連線了,但是依然要開一個命令提示字元的視窗,有辦法關掉它嗎?
這時候我們要靠M$提供的優秀程式「start.exe」了!
只需要執行
start /b plink -D 1080 -N -pw ooxx user@xxx.xxx.xxx.xxx
即可~
要關閉,需要按「Ctrl+Alt+Del」,接著把plink結束執行。
OpenSSH作法:
如果我們需要在Linux或FreeBSD這類機器上做類似的工作呢?我們需要什麼樣的程式?
完全不用,Linux內附的ssh就提供這樣的功能了,它的操作如下:
ssh -f -N -L 1080:: user@xxx.xxx.xxx.xxx
照例,列出它的參數說明:
-f 背景執行
-N 不要執行SHELL
-L 後面填入你要的port,「::」表示省略remote host和remote port
user@xxx.xxx.xxx.xxx 表示你SSH的帳號和SSH Server IP
=============================================================
SSH Tunnel心得:
一直以來都知道SSH其實只是一個加密的Tunnel,本身不像telnet只有提供終端機服務,
但是對SSH的Tunnel並沒有很大的興趣去玩它,又或者說其實是不會玩~
前陣子原本因為PSPad不支援sftp,因此用了一套「Bitvise Tunnelier」的軟體,
它能提供SFTP-FTP的功能,讓PSPad可以透過它連上SFTP機器,
此外,它也有Socks Tunnel的功能,讓我覺得非常方便~
無奈Bitvise Tunnelier需要在右下角有個圖示,而且Linux上不能用,
要做壞事就因此受限了,因此在研究有沒有程式可以做到Socks Tunnel的功能,
又可以跑在背景的~
答案是PuTTY和所屬的plink(PuTTY Link),以下是使用法。
PuTTY作法:
首先從最基本的PuTTY使用法介紹起,要用PuTTY來幫你做SSH Tunnel很簡單,
如下面這篇的作法:
http://www.pumb.org/viewthread.php?tid=155&fpage=1&highlight=
簡單的說,就是按照一般PuTTY使用,填入「Host Name(or IP address)」和「Port」,
接著點選左邊「Connection」->「SSH」->「Tunnels」
接著在「Source port」填入「1080」(你喜歡的port),
點選「Dynamic」,之後按下「Add」
之後按正常方式連線,放著即可~~
PuTTY Link(plink)作法:
PuTTY雖然方便,可是它要開個討厭的視窗,可以不要嗎?
答案就是plink。
首先到PuTTY的網站下載plink.exe,網址如下:
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
下面先給個範例:
plink -D 1080 -N -pw ooxx user@xxx.xxx.xxx.xxx
plink其實就是PuTTY的指令版,沒有圖形化的選單,也沒有ANSI支援,但是它有PuTTY的連線能力。
我們會用到的幾個參數介紹如下:
-D Dynamic SOCKS-based port forwarding(其實就是PuTTY點選的「Dynamic」,後面填上喜歡的port
-N don't start a shell/command (SSH-2 only)(雖然僅支援SSH2,但這不是問題,它的功能是不要開啟討厭的SHELL)
-pw 你的SSH密碼
user@xxx.xxx.xxx.xxx 你SSH的帳號和SSH Server的IP
測試後可以連線了,但是依然要開一個命令提示字元的視窗,有辦法關掉它嗎?
這時候我們要靠M$提供的優秀程式「start.exe」了!
只需要執行
start /b plink -D 1080 -N -pw ooxx user@xxx.xxx.xxx.xxx
即可~
要關閉,需要按「Ctrl+Alt+Del」,接著把plink結束執行。
OpenSSH作法:
如果我們需要在Linux或FreeBSD這類機器上做類似的工作呢?我們需要什麼樣的程式?
完全不用,Linux內附的ssh就提供這樣的功能了,它的操作如下:
ssh -f -N -L 1080:: user@xxx.xxx.xxx.xxx
照例,列出它的參數說明:
-f 背景執行
-N 不要執行SHELL
-L 後面填入你要的port,「::」表示省略remote host和remote port
user@xxx.xxx.xxx.xxx 表示你SSH的帳號和SSH Server IP
2007年3月22日
Regular Expression對中文Unicode的支援
最近寫電視節目表擷取程式,發現最大問題在於中文擷取,對於如何框定中文,是一件很麻煩的事情,目前我常見的方法是利用「>(.*)」類似這樣的方法來做,可是效果很差,尤其遇到有些沒斷行的網頁,完全無法判斷(.*的判斷準則是斷行),因此在想要如何在RegEx上對中文進行判斷。
聽說有學校有學長會RegEx,當然先去問他,可是很不幸的,他並沒有相關的經驗,一提到就覺得很難搞得樣子,最後他說透過ASCII的方式,用16進位的範圍來判斷,方法很基本,可是我在想,應該不能適用在Unicode或UTF-8吧... :(
上網找之後,發現還是可以的,但是要使用Unicode的作法,最後很不幸的,在php上的作法和學長提的類似,不過能夠達成任務,就相當不錯。
以下是打的心得:
==========================================================
Regular Expression對中文Unicode的支援:
目前Unicode已經是主流,看ASCII的反而不實用了~
regex目前我會用到的,大概就是 Java 和 php,
要在 Java 上用 regex 抓出中文,如下:
Matcher matcher = Pattern.compile("\\p{InCJKUnifiedIdeographs}").matcher(字串);
while( matcher.find() )
{
String 一個中文字 = matcher.group();
}
這邊要解釋「\\p{InCJKUnifiedIdeographs}」:
在 Unicode 中,有針對各個編碼區塊做分類,它的列表可以參照下面的檔名:
Unicode 3.2 的列表:
http://www.unicode.org/Public/3.2-Update/Blocks-3.2.0.txt
Unicode 4.1.0 的列表:
http://www.unicode.org/Public/4.1.0/ucd/Blocks.txt
Unicode 5.0 的列表
http://www.unicode.org/Public/5.0.0/ucd/Blocks.txt
這個表裡面列出了統一碼區塊名和相對應的 Unicode 區段,
而其中的「CJK Unified Ideographs」就是我們的中文字區段(看名稱,應該包含日文、簡體、韓文),
而在 RegEx 中,可以透過「\p」來指定這個統一碼區塊名,
透過指定它,找出相對應的文字範圍,Java 就是這樣做的。
至於細節,可以參考:
http://www.javaworld.com.tw/confluence/display/J2SE/Regular+Expression's+Unicode+support
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html
至於 php,php 的 PCRE RegEx function,它使用 PCRE 套件(原本用於 perl,移植到 php),
PCRE 的 \p 並無法支援「CJK Unified Ideographs」,
而在 PCRE 的套件下,要能夠擷取出 Unicode,常見的作法有兩種:
1.
使用 \u 來指定 Unicode 的碼,可惜 php 的 PCRE 不支援
2.
使用 \x 來指定 Unicode 的碼,這個沒問題
參考網頁:
http://tw.php.net/manual/tw/reference.pcre.pattern.modifiers.php
原文:
=================================================================
Spent a few days, trying to understand how to create a pattern for Unicode chars, using the hex codes. Finally made it, after reading several manuals, that weren't giving any practical PHP-valid examples. So here's one of them:
For example we would like to search for Japanese-standard circled numbers 1-9 (Unicode codes are 0x2460-0x2468) in order to make it through the hex-codes the following call should be used:
preg_match('/[\x{2460}-\x{2468}]/u', $str);
Here $str is a haystack string
\x{hex} - is an UTF-8 hex char-code
and /u is used for identifying the class as a class of Unicode chars.
Hope, it'll be useful.
=================================================================
它使用「/xxx/u」,在最後加上「u」,以這方式支援 UTF-8,
而在「/xxx/」內部,使用「[\x{2460}-\x{2468}]」來框出 Unicode 的統一碼範圍,
而要使用類似方式來應用在中文,就非常容易了,
如前面所述,看看 Blocks 的內容,
CJK Unified Ideographs 的統一碼範圍在 4E00..9FFF
答案揭曉~~
下面來個 php 的範例:
=================================================================
#!/usr/bin/php -q
$a = "def:123:這是:AB=你好!";
$pattern = '/123:([\x{4e00}-\x{9fff}]+):[A-B]*/u';
preg_match($pattern, $a,$match);
echo $match[0];
?>
=================================================================
可以得出
=================================================================
123:這是:AB
=================================================================
聽說有學校有學長會RegEx,當然先去問他,可是很不幸的,他並沒有相關的經驗,一提到就覺得很難搞得樣子,最後他說透過ASCII的方式,用16進位的範圍來判斷,方法很基本,可是我在想,應該不能適用在Unicode或UTF-8吧... :(
上網找之後,發現還是可以的,但是要使用Unicode的作法,最後很不幸的,在php上的作法和學長提的類似,不過能夠達成任務,就相當不錯。
以下是打的心得:
==========================================================
Regular Expression對中文Unicode的支援:
目前Unicode已經是主流,看ASCII的反而不實用了~
regex目前我會用到的,大概就是 Java 和 php,
要在 Java 上用 regex 抓出中文,如下:
Matcher matcher = Pattern.compile("\\p{InCJKUnifiedIdeographs}").matcher(字串);
while( matcher.find() )
{
String 一個中文字 = matcher.group();
}
這邊要解釋「\\p{InCJKUnifiedIdeographs}」:
在 Unicode 中,有針對各個編碼區塊做分類,它的列表可以參照下面的檔名:
Unicode 3.2 的列表:
http://www.unicode.org/Public/3.2-Update/Blocks-3.2.0.txt
Unicode 4.1.0 的列表:
http://www.unicode.org/Public/4.1.0/ucd/Blocks.txt
Unicode 5.0 的列表
http://www.unicode.org/Public/5.0.0/ucd/Blocks.txt
這個表裡面列出了統一碼區塊名和相對應的 Unicode 區段,
而其中的「CJK Unified Ideographs」就是我們的中文字區段(看名稱,應該包含日文、簡體、韓文),
而在 RegEx 中,可以透過「\p」來指定這個統一碼區塊名,
透過指定它,找出相對應的文字範圍,Java 就是這樣做的。
至於細節,可以參考:
http://www.javaworld.com.tw/confluence/display/J2SE/Regular+Expression's+Unicode+support
http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html
至於 php,php 的 PCRE RegEx function,它使用 PCRE 套件(原本用於 perl,移植到 php),
PCRE 的 \p 並無法支援「CJK Unified Ideographs」,
而在 PCRE 的套件下,要能夠擷取出 Unicode,常見的作法有兩種:
1.
使用 \u 來指定 Unicode 的碼,可惜 php 的 PCRE 不支援
2.
使用 \x 來指定 Unicode 的碼,這個沒問題
參考網頁:
http://tw.php.net/manual/tw/reference.pcre.pattern.modifiers.php
原文:
=================================================================
Spent a few days, trying to understand how to create a pattern for Unicode chars, using the hex codes. Finally made it, after reading several manuals, that weren't giving any practical PHP-valid examples. So here's one of them:
For example we would like to search for Japanese-standard circled numbers 1-9 (Unicode codes are 0x2460-0x2468) in order to make it through the hex-codes the following call should be used:
preg_match('/[\x{2460}-\x{2468}]/u', $str);
Here $str is a haystack string
\x{hex} - is an UTF-8 hex char-code
and /u is used for identifying the class as a class of Unicode chars.
Hope, it'll be useful.
=================================================================
它使用「/xxx/u」,在最後加上「u」,以這方式支援 UTF-8,
而在「/xxx/」內部,使用「[\x{2460}-\x{2468}]」來框出 Unicode 的統一碼範圍,
而要使用類似方式來應用在中文,就非常容易了,
如前面所述,看看 Blocks 的內容,
CJK Unified Ideographs 的統一碼範圍在 4E00..9FFF
答案揭曉~~
下面來個 php 的範例:
=================================================================
#!/usr/bin/php -q
$a = "def:123:這是:AB=你好!";
$pattern = '/123:([\x{4e00}-\x{9fff}]+):[A-B]*/u';
preg_match($pattern, $a,$match);
echo $match[0];
?>
=================================================================
可以得出
=================================================================
123:這是:AB
=================================================================
訂閱:
文章 (Atom)