java转文件编码bom_编码转换:UTF-8 BOM to GBK
在網上看了很多例子,也查了python API,發現都不完整,原因就在于都沒考慮到有BOM和無BOM兩種情況。也有說用codecs.EncodedFile(...)來做的,試了很多次,無論是有BOM還是無BOM,轉成GBK都失敗。
下面來看我的試驗過程。
1.無BOM的UTF-8轉GBK
首先用ultraedit新建一個文本文件,并存為UTF-8 無BOM格式,我的叫“u8.txt”,內容為“試 試 這 個”,帶回車換行,并且字符間加了空格,以便定位;
其次,寫代碼測試:
importcodecs
f =?open("u8.txt", "r");
data = f.read();
print repr(data)
print data.decode("utf-8").encode("gbk")
s = '/xe8/xbf/x99 /xe4/xb8/xaa';
print s.decode("utf-8").encode("gbk")
f.close();
運行查看結果:
根據輸出可見,第一行是4個漢字字符的UTF-8編碼,每個字符占3個字節,最后跟著一個換行符;第二行是編碼為GBK后打印的結果,說明編碼轉換沒有問題;注意字符串s的內容為我手工截取的最后兩個字符的字節編碼,即“這 個”,對s先解碼再編碼成GBK后,成功輸出。
由此可知,無BOM的UTF-8轉換成GBK是很容易的。
2.有BOM的UTF-8轉GBK
首先,仍然用ultraedit新建一個文本文件,但是需要保存為UTF-8,這就是有BOM的格式,我的是“char.txt”,內容為“老 子 不 信 轉 不 過 來”,也是帶空格以便定位字符,仍然用上面的代碼運行,結果為:
出現錯誤!提示說無法對0字節處采用GBK編碼,再看顯示出的編碼序列,發現最開頭那段6個字節連在一起,但是我們的字符串分明是按空格分開的!怎么回事?!通過查wikipedia發現:
原來最開始的“/xef/xbb/xbf”是UTF-8的BOM!那是不是因為這個BOM才造成編碼轉換失敗的呢?可以復制BOM后面的內容作為字符串s的內容,寫代碼測試,代碼如下:
s = '/xe8/x80/x81 /xe5/xad/x90 /xe4/xb8/x8d /xe4/xbf/xa1 /xe8/xbd/xac /xe4/xb8/x8d /xe8/xbf/x87 /xe6/x9d/xa5/n'
print s.decode("utf-8").encode("gbk")
運行后發現,轉換成功進行,這就是說,只要能在轉換前去掉BOM,那么就能轉換成功。
根據上面的心得,我寫了下面的代碼測試:
代碼說明:bom為讀取文件前3個字節的內容,codecs.BOM_UTF8代表的就是utf8 BOM的字節編碼,前面已經提到了。if語句判斷是否為UTF8 BOM格式,如果是,我們就從文件的第3個字節開始讀文件,以便避開BOM,然后就是轉換,最后成功輸出。
代碼中“注意”那行打印出字節編碼,可見,字符已被轉換成2 Bytes per character的GBK編碼格式。
結束語:這里只寫了UTF8格式的,UTF16的道理也一樣,只是UTF16的BOM只有兩個字節,具體可見上面的BOM表示的圖。總結起來說就是:UTF8轉GBK本來是很容易的,因為字符都對應,只是因為有了BOM,使問題變得麻煩些,不過弄懂了原理也不復雜
總結
以上是生活随笔為你收集整理的java转文件编码bom_编码转换:UTF-8 BOM to GBK的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AMD处理器,DDR4内存支持全解析
- 下一篇: 电脑维修工程师揭秘:三大主板内存问题解决