看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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