新聞速報

        

2014年2月27日 星期四

如何區分文字檔是 ANSI、UniCode(UTF-16)、UTF-8

如何區分文字檔是 ANSI、UniCode(UTF-16)、UTF-8
 
UniCode(UTF-16): 任何文字都是 2 Bytes
 
UTF-8 : 英文、數字為 1 Byte,其餘的符號(如:中文)為 2~6 Bytes
視第 1 個Byte的前 4 個Bit 有幾個(binary)1 (這裡有爭議),表示使用幾個Byte; 
其後接續的每一個Byte之bit組合,其開頭為(binary)10。 
 
例如:中文需要 3 個Byte,格式為 1110 xxxx, 10xx xxxx, 10xx xxxx 
第一碼 E0 ~ EF
第二碼 80 ~ BF
第三碼 80 ~ BF
 
若是為 2 個Byte,格式為 1100 xxxx, 10xx xxxx 
第一碼 C0 ~ CF
第二碼 80 ~ BF
 
UniCode文字檔 ,檔頭有BOM表 ,檔頭內容以 0xFF 0xFE ( 2 碼) 為開始。
 
UTF-8文字檔 ,檔頭有BOM表 (又稱UTF-8 signature),檔頭內容以 0xEF 0xBB 0xBF ( 3 碼) 為開始。
 
UTF-8文字檔 ,檔頭無BOM表 ,無檔頭、內容同 ANSI 為 Raw Data。
但是可以分析其所有的Raw Data 來決定是純ANSI 格式、還是UTF-8 格式。
例如: 連續3個byte為 [E0~EF] , [80~BF] , [80~BF] 或 連續2個byte為 [C0~DF] , [80~BF] 就一定是UTF-8 的文件。

判斷方法: 也就是一個byte一個byte去讀,然後判別是否為 非ASCII ( 因為ASCII 的值介於 0-127 )用此去區隔
 
如果不是ASCII 判斷此字元的第一個Byte ?  是否符合UTF8的第一個Byte的規定!!
符合再去分析 第一個Byte 是 110X XXXX 或是 1110 XXXX 或是 1111 0XXX
依此 去判斷接下來的 下一個Byte 或是 下兩個Byte 或是 下三個Byte,皆是否符合UTF-8 的規定..
PS: 一份純英文加數字、不帶任何特殊符號的文件,其實他的 ANSI 編碼跟 UTF-8 編碼是長得完全一樣的。要讀這樣的檔案,並不存在判定編碼的問題 

沒有留言:

張貼留言