Python3 讀寫UTF-16/UTF-16-LE 文字檔 - Lo爸的遊戲區
文章推薦指數: 80 %
【重點寫在前面】 讀檔時: 用encoding='utf-16-le' 讀取UTF-16 文字檔時, ... 讀取UTF-16-LE 文字檔時,會發生錯誤,無法讀取;因為python 會期待有 ...
跳至內容區
josephleee
Coding
17一月,201831一月,2018
1分
【重點寫在前面】
讀檔時:
用encoding=’utf-16-le’讀取UTF-16文字檔時,會誤把檔頭(BOM,也就是’\ufeff’字元)讀進變數裡。
用encoding=’utf-16′讀取UTF-16-LE文字檔時,會發生錯誤,無法讀取;因為python會期待有一個檔頭。
寫檔時:
用encoding=’utf-16′寫檔時,會自動地在檔案內容前產生一個檔頭,並寫進檔案裡。
用encoding=’utf-16-le’寫檔時,不會自動地產生檔頭。
【看看測試過程】
f16le,f16='utf16le_test.txt','utf16_test.txt'
#產生檔案
withopen(f16le,'w',encoding='utf-16-le')asf1:
withopen(f16,'w',encoding='utf-16')asf2:
foo='\r\n'.join(['abc','123','999'])
f1.write(foo)
f2.write(foo)
#用正確的編碼設定來讀檔
withopen(f16le,encoding='utf-16-le')asf1:
withopen(f16,encoding='utf-16')asf2:
b1=f1.readlines()
b2=f2.readlines()
#用錯誤的編碼設定來讀檔
withopen(f16,encoding='utf-16-le')asf1:
withopen(f16le,encoding='utf-16')asf2:
c1=f1.readlines()
c2=f2.readlines()
結果:
b1,b2,c1皆可正確讀取;c2無法讀取,有錯誤,Python會期待UTF-16的檔案擁有一個檔頭。
然後,我們可以用下列幾行程式來檢查Python會不會將檔頭的字元(‘\ufeff’)讀進變數中:
caption='(首字元長度,首字元)'
print('b1:',end='')
print('%s=(%s,%s)'%(caption,len(b1[0][0]),b1[0][0]))
print('b2:',end='')
print('%s=(%s,%s)'%(caption,len(b2[0][0]),b2[0][0]))
print('c1:',end='')
print('%s=(%s,%s)'%(caption,len(c1[0][0]),c1[0][0]))
輸出結果:
b1:(首字元長度,首字元)=(1,a)
b2:(首字元長度,首字元)=(1,a)
c1:(首字元長度,首字元)=(1,)
也就是說,只有在用encoding=’utf-16-le’讀取UTF-16檔案時,才會將檔頭讀進變數中。
然而,就實用層面而言,使用UTF-16來寫檔讀檔,python會自動幫我們處理BOM的問題,比較不容易造成使用上的混淆。
所以,為了正確的產生UTF-16文字檔,下面提供兩種等效的寫檔作法:
body='Sometextcontents\nblah,blah,blah...\netc'
#作法(一)
withopen('file_1.txt','w',encoding='utf-16')asf:
f.write(body)
#作法(二)
withopen('file_2.txt','w',encoding='utf-16-le')asf:
f.write('\ufeff')#BOMforutf-16
f.write(body)
#以後要讀檔時,
#一率使用open(filename,'r',encoding='utf-16')
【結論】
用正確的編碼讀檔時,python3不會把檔頭讀進變數中。
用不正確的編碼讀檔時:encoding=’utf-16-le’會把UTF-16的檔頭(‘\ufeff’)讀進變數中;而encoding=’utf-16′無法讀取UTF-16-LE文字檔。
用encoding=’utf-16′寫檔時,會自動地在檔案內容前產生一個檔頭,並寫進檔案裡。
用encoding=’utf-16-le’寫檔時,不會自動地產生檔頭。
Ref: http://avidinsight.uk/2016/01/why-python-3-doesnt-write-the-unicode-bom/
廣告
Sharethis:TwitterFacebook請按讚:喜歡正在載入...
相關
已加上的標籤encodingpython
發表者:josephleee
檢視「josephleee」的全部文章
已發表
17一月,201831一月,2018
文章分頁導航
前一篇Windows找不到Python?!下一篇人類的問題vs.工具的問題
發表迴響取消回覆
在此輸入你的回應…
在下方填入你的資料或按右方圖示以社群網站登入:
電子郵件(必須填寫)(電子郵件地址不會公開)
名稱(必須填寫)
個人網站
您的留言將使用WordPress.com帳號。
( 登出 /
變更 )
您的留言將使用Twitter帳號。
( 登出 /
變更 )
您的留言將使用Facebook帳號。
( 登出 /
變更 )
取消
連結到%s
透過電子郵件通知我後續回應。
有新文章時用Email通知我。
Δ
搜尋:
近期文章
如何輸入附帶注音符號的字
awk筆記:用split() 將字串分段
awk筆記:用substr() 擷取字串片段
用PowerShell大量複製檔案
被欺負怎麼辦?
文章存檔
2022年五月
2021年十一月
2020年十月
2019年十二月
2018年十月
2018年六月
2018年四月
2018年一月
2017年十二月
分類
Coding
爸媽家務事
生活與人生
健康控制
思考、想法(Thoughts)
其它
註冊 登入
訂閱網站內容的資訊提供
訂閱留言的資訊提供
WordPress.com
隱私權與Cookie:此網站可使用Cookie。
繼續使用此網站即表示你同意使用Cookie。
若要瞭解更多資訊,包括如何控制Cookie,請參閱此處:
Cookie政策
追蹤
已追蹤
Lo爸的遊戲區
我要註冊
已經有WordPress.com帳號了?立即登入。
Lo爸的遊戲區
自訂
追蹤
已追蹤
註冊
登入
複製短網址
回報此內容
以閱讀器檢視
管理訂閱
收合此列
%d位部落客按了讚:
延伸文章資訊
- 1Unicode HOWTO — Python 3.10.7 documentation
UTF stands for “Unicode Transformation Format”, and the '8' means that 8-bit values are used in t...
- 2Why Python 3 doesn't write the Unicode BOM - Peter Bloomfield
Python doesn't always output a Unicode Byte Order Mark. ... When handling Unicode, Windows and Vi...
- 3UTF-16 - IBM
- 4Python codecs.BOM_UTF16_LE Examples - ProgramCreek.com
BOM_UTF16_LE): contents = contents[len(codecs.BOM_UTF16_LE):] # TODO(2.2): Remove when 2.3 become...
- 5utf-16le[BOM] to utf-8 file solution - GitHub
http://stackoverflow.com/questions/22459020/python-decode-utf-16-file-with-bom. import codecs. en...