問題引入:
1、UTF-8中漢字占三個字節(jié) ASCII字符占一個字節(jié)
2、Unicode中所有字符一律占 兩個字節(jié)
3、GBK,GB2312,GB18030中漢字占兩個字節(jié) ASCII字符占一個字節(jié)
問題實例:
現(xiàn)在用Windows的記事本新建文件test.txt,輸入 a(回車) 。
分別另存為GBK,文件名為test1.txt;Unicode,文件名test2.txt;UTF-8,文件名test3.txt。
按理說,test1.txt的大小為'a\r\n'3個字節(jié) test2.txt的大小為 'a\r\n' 6個字節(jié) test3.txt的大小為 'a\r\n' 3個字節(jié)
但是實際上:
GBK
Unicode
UTF-8
(黑人臉問號??)
實際上:
GBK
Unicode
UTF-8
百度百科:
GBK文件中就是只有字符的值本身大小
Unicode文件中會多出 'FF FE' 開頭
注意:如果一個Unicode格式文檔的開頭為'FF FE', 表示小端(LittleEndian)
如果一個Unicode格式文檔的開頭為'FE FF', 表示大端(BigEndian)
小端 \r\n的字節(jié)序為' 0D 00 0A 00' (本文中test2.txt就是 小端)
大端 \r\n的字節(jié)序為' 00 0D 00 0A'
BOM(Byte Order Mark),字節(jié)順序標記,出現(xiàn)在文本文件頭部,Unicode編碼標準中用于標識文件是采用哪種格式的編碼。
在test3.txt中出現(xiàn)的'EF BB BF' 就是BOM
什么是BOM
BOM
使用Sumblime保存無BOM的UTF-8
無BOM的UTF-8
果然test4.txt沒有了BOM前綴
所以:test1.txt GBK 沒有前綴所以占 3個字節(jié)
test2.txt Unicode 有小端 'FF FE' 2個字節(jié) + 3 x 2 = 8個字節(jié)
test3.txt UTF-8 with BOM 有BOM 'EF BB BF' 3個字節(jié) + 每個英文1個字節(jié)x 3 = 6 個字節(jié)
文本文件會比理論字符串的大小更大。
雖然文件中有這么多問題,但是,在各類編程語言中,“字符串”的編碼字節(jié)占用規(guī)律還是對的,比如GBK中一個漢字兩個字節(jié),且高位都是1,ASCII字符占一個字節(jié)。
編碼問題很坑爹,解決要謹慎!不過也遺留問題,Java中使用的Unicode是那種平面?
ANSI
本文是作者原創(chuàng),如有錯誤,歡迎指正
聯(lián)系客服