[Python] 使用 utf-16-le 編碼寫出來的檔案有問題?
今天遇到 python 寫 unicode 檔案的一個問題…
我們用 python 寫出一個 Windows .url 的檔案,
這個 .url 檔案其實是類似於 Windows INI 的格式,
大家都知道 Windows INI 要嘛就是 ANSI 編碼,要嘛就是 UTF-16 編碼,
在我想寫出中文字在 INI 的狀況下,它非得是 UTF-16 編碼不可~
於是,一開始先用下面的指令去把「中文」這兩個字寫成檔案,
想說 Intel x86 系統都是 little-endian,所以編碼指定成 utf-16-le:
codecs.open("test_utf16.txt", "w", "utf-16-le").write(u'u4e2du6587')
可是卻發現 IE 沒辦法把這個檔案開起來,
而直接用文書編輯器打開檔案,內容也很怪異:
不過如果編碼是採用 utf-16 的話:
codecs.open("test_utf16.txt", "w", "utf-16").write(u'u4e2du6587')
IE 就可以開啟檔案,文書編輯器也可以正常的開啟檔案:
這是為什麼呢?一開始真是百思不得其解…
參考了 stackoverflow: Adding BOM (unicode signature) while saving file in python
再加上用 hexdump 比較了一下,終於理解了~
testuser@localhost ~ $ hexdump -C test_utf16_le.txt 00000000 2d 4e 87 65 |-N.e| 00000004 testuser@localhost ~ $ hexdump -C test_utf16.txt 00000000 ff fe 2d 4e 87 65 |..-N.e| 00000006
看起來是如果指定成 utf-16 編碼的話,
因為系統可能是 Little-Endian,也有可能是 Big-Endian,
因此會有個 FF FE 的 BOM 檔頭來做標明,系統才能正確解讀這個 utf-16 編碼~
但如果指定成 utf-16-le 編碼的話,等於是「很確定系統是 Little-Endian 編碼」,
因此 codecs.open() 不會自動幫你加上 FF FE 的 BOM 檔頭…
這會導致 IE 誤以為這是一個 ANSI 檔案,自然沒辦法正確的解析檔案內容了~
小小的差異,卻是完全不同的結果呀~
(本頁面已被瀏覽過 1,357 次)