作者ducksteven (啞子七号)
看板Ruby
標題[問題] 關於 Big5 與 regexp
時間Wed Apr 15 03:32:18 2009
環境:
Ruby 1.8.7
狀況:
輸入:一個 Big5 的純文字檔 input.txt
裏面的內容只有四個字:
東吳大學
操作:開檔,讀內容,判斷它是否 match /^[\d\w]{8}$/
預期結果: nil
實際結果:因 $KCODE 而異 (!?)
在 $KCODE='u' 的時候會 match 到
\d\w 不是只會 match 到英文字母和數字嗎?
想請問大家為甚麼會這樣 :( 感謝
附錄:
程式:
#!/usr/bin/ruby -w
$KCODE='u' # 這一行註解與否會影響到正規表示法的 match
File.open("input.txt", "r").each_line do |l|
if l.chomp.match(/^[\d\w]{8}$/)
puts "matched"
end
end
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.122.166.137
※ 編輯: ducksteven 來自: 140.122.166.137 (04/15 03:35)
1F:→ iamweep:你的程式把東吳大學的binary當成UTF-8來解讀而match \w 04/15 07:23
2F:→ godfat:你 $KCODE 設 u 然後讀 big5 不是在欺騙 ruby 嗎 @@ 04/15 11:35
3F:→ ducksteven:這是節錄 原本的程式要同時處理 big5 和 utf8 04/15 13:09
4F:→ godfat:用 ruby 1.8 的話,這樣只能用 byte sequence 來做 04/15 13:41
5F:→ ducksteven::o 意思是我應該把 big5 和 utf8 分開處理囉? 04/15 22:02
6F:→ godfat:當然,而且\w是會match中文字的,你要[A-Za-z]才是英文字母 04/15 22:41
7F:→ godfat:要統一處理就轉個編碼,或是用 1.9.1 吧 04/15 22:41
8F:→ ducksteven:嗯嗯 謝謝 :) 04/15 23:43
9F:→ iamweep:統統轉成UTF-8來做,用iconv 04/16 02:00
10F:→ ducksteven:這個有技術上的困難 因為它有些字是 ...造字... XDD 04/16 03:01
11F:→ godfat:如果是 big5-hkscs, iconv 支援,如 UAO, 海字集,要另找 04/16 10:50
12F:→ godfat:如果是完全自己的造字... 只能自己寫了 XD 04/16 10:50
13F:→ ducksteven:是啊 就是完全造字...XD 04/16 18:02
14F:→ Schelfaniel:完全自己造字有時連 iconv 都會轉失敗,超慘的 04/16 20:38