[Python] 使用 utf-16-le 編碼寫出來的檔案有問題?

[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 沒辦法把這個檔案開起來,

而直接用文書編輯器打開檔案,內容也很怪異:

Screen Shot 2015-09-08 at 11.53.27 PM  

 

不過如果編碼是採用 utf-16 的話:

codecs.open("test_utf16.txt", "w", "utf-16").write(u'u4e2du6587')

 

IE 就可以開啟檔案,文書編輯器也可以正常的開啟檔案:

Screen Shot 2015-09-08 at 11.54.59 PM  

 

這是為什麼呢?一開始真是百思不得其解…

參考了 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,328 次)

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料