作者buganini (霸格尼尼)
看板C_and_CPP
標題Re: [問題] utf8/ansi的判斷?
時間Wed Aug 19 02:06:54 2009
※ 引述《varg (gogogo)》之銘言:
: 有一隻c code需要判斷輸入檔案是ansi/utf8
: 我本來是抓前三個byte用bom的方法去判斷
: 測試也ok
: 但最近測試資料一多 發現有些檔案開頭不見得是ef bb bf
: 例如23 69 66 64 用notepad開他也當作是utf8
: 想請問還有什麼方法可以用來判斷?
: 另外若要做ansi to utf8的動作
: 一定要ansi->unicode->utf8嗎?
: thanx
1.
iconv好像有encoding detect的功能
沒有的話 可以用試轉換的方式
短的資料是有可能同時符合兩種編碼
如果真的要自己來的話
看你所謂的ANSI是什麼 如果是Big5的話
Big5是[\xA0-\xFE][\x40-\x7E]
UTF-8則是
第一個byte 0xxxxxxx 單獨存在 就是ascii啦 (00~7F)
110xxxxx 後接一個byte (C0~DF)
1110xxxx 後接兩個byte (EF~EF)
11110xxx 後接三個byte (F0~F7)
...再下去好像目前不使用
之後的byte都是10xxxxxx (80~BF)
自己照規則判斷囉...
2.
UTF-8是Unicode的那個編號再轉換一下
所以中間還是要經過Unicode
轉換方式就像上面寫的規則
把原本unicode code的bit拆開放在x的位置
要幾個byte選用不同的開頭
wikipedia上面都有寫
3.
用現成的函式處理比較輕鬆...
另外 不要依賴UTF-8的BOM
因為UTF-8是不需要BOM的
都是用big endian在拆bit
標準上也寫明不用BOM
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.135.231.23
※ 編輯: buganini 來自: 220.135.231.23 (08/19 02:09)
※ 編輯: buganini 來自: 220.135.231.23 (08/19 02:09)
推 varg:thanx! 08/19 02:47
→ ykjiang:utf8 回溯相容於 ansi ,都當 utf8 處理就好了 08/19 13:02
→ ykjiang:當然,記得跳過 BOM 08/19 13:02
→ ykjiang:A ansi text file is also a utf8 text file 08/19 13:03
→ buganini:我想他說的ansi是notepad裡面所謂的ansi 也就是locale 08/19 13:31
→ buganini:裡面指定的charset/encoding, 在這應該是big5/cp950 08/19 13:31
→ buganini:而不是ascii 08/19 13:31