2008年12月22日星期一
PHP 繁簡字碼直接轉換
最近幾日都係度整緊字碼既事 ,UTF-8, BIG5, GB2312, GBK。 要做既係兩樣野:
總結如下:
iconv斷字
icon 遇到無法轉換的字時, 預設是會斷句。
可以在第2個参數加入//IGNORE
iconv("BIG5","UTF-8//IGNORE",$query);
或//TRANSLIT
iconv("BIG5","UTF-8//TRANSLIT",$query);
也可以兩個参數一起來
iconv("BIG5","UTF-8//IGNORE//TRANSLIT",$query);
用mb_convert_encoding 的話, 但會把有問題的字換成 "?"
gb->utf8
iconv("GBK","UTF-8//ignore",$word);
iconv("GB2312","UTF-8//ignore",$word);
用GBK比GB2312好, 據說係因為GBK既字庫比較大
mb_convert_encoding
mb_convert_encoding($word,"UTF-8","BIG-5");
有以下地方要注意:
charset detecting
-繁簡字碼可能會誤測, 所以次序很重要
繁簡換轉
上GOOGLE搜尋一下,
如果想簡轉繁的話, 方法是 UTF-8 -> GB2312 -> BIG5 -> UTF-8, 的確是可行的, 也不用任何外部的文件。但因為BIG5和 GB2312的字庫不夠UTF-8的大, 所以總有些字會變成 "?"。
解決方法是找個 簡體的UTF-8 -> 繁體UTF-8 的MAP , 再跟據MAP直接轉換。問GOOGLE後發現好像沒有人試過這樣做, 所以就寫了個類轉換。
源碼可以這下載
http://code.google.com/p/fukidutf8t2s/
- detect charset
- 簡繁轉換
總結如下:
iconv斷字
icon 遇到無法轉換的字時, 預設是會斷句。
可以在第2個参數加入//IGNORE
iconv("BIG5","UTF-8//IGNORE",$query);
或//TRANSLIT
iconv("BIG5","UTF-8//TRANSLIT",$query);
//TRANSLIT will raise an exception on characters it can't transliterate, however; this can be solved by using '//IGNORE//TRANSLIT' together (in that order).
iconv("BIG5","UTF-8//IGNORE//TRANSLIT",$query);
用mb_convert_encoding 的話, 但會把有問題的字換成 "?"
gb->utf8
iconv("GBK","UTF-8//ignore",$word);
iconv("GB2312","UTF-8//ignore",$word);
用GBK比GB2312好, 據說係因為GBK既字庫比較大
mb_convert_encoding
mb_convert_encoding($word,"UTF-8","BIG-5");
有以下地方要注意:
- 参數次序跟ICONV剛好倒轉
- "BIG5" 要換成 "BIG-5"
- "EUC-CN"要換成"GB2312"
- "CP936" 要換成 "GBK"
charset detecting
$encoding_list="UTF-8,BIG-5,EUC-CN";
mb_detect_encoding($word, $encoding_list);
$encoding_list為 charset 的次序
-繁簡字碼可能會誤測, 所以次序很重要
繁簡換轉
上GOOGLE搜尋一下,
如果想簡轉繁的話, 方法是 UTF-8 -> GB2312 -> BIG5 -> UTF-8, 的確是可行的, 也不用任何外部的文件。但因為BIG5和 GB2312的字庫不夠UTF-8的大, 所以總有些字會變成 "?"。
解決方法是找個 簡體的UTF-8 -> 繁體UTF-8 的MAP , 再跟據MAP直接轉換。問GOOGLE後發現好像沒有人試過這樣做, 所以就寫了個類轉換。
源碼可以這下載
http://code.google.com/p/fukidutf8t2s/
訂閱:
文章 (Atom)