[英]Python UTF-16 encoding hex representation
我在Python 2.7.2中有一個字符串,說u“ \\ u0638”。 當我將其寫入文件時:
f = open("J:\\111.txt", "w+")
f.write(u"\u0638".encode('utf-16'))
f.close()
以十六進制形式顯示:FF FE 38 06當我將這樣的字符串打印到stdout時,我將看到:'\\ xff \\ xfe8 \\ x06'。
問題: 輸出到stdout的字符串中的\\ x38在哪里? 換句話說,為什么輸出到stdout的字符串不是'\\ xff \\ xfe \\ x38 \\ x06'?
如果我將字符串兩次寫入文件:
f = open("J:\\111.txt", "w+")
f.write(u"\u0638".encode('utf-16'))
f.write(u"\u0638".encode('utf-16'))
f.close()
文件中的十六進制表示形式包含兩次字節順序標記(BOM)\\ xff \\ xfe:FF FE 38 06 FF FE 38 06
我想知道避免在UTF-16編碼的字符串中寫入BOM的技術是什么?
ASCII字符8
具有十六進制表示形式0x38
。 所以你的字符串:
\xff\xfe8\x06
是四個字節長。 用空格分隔,字節為:
\xff \xfe 8 \x06
對於不代表可打印ASCII字符的字節,Python使用\\x
表示法。
編碼為“ utf-16le”或“ utf-16be”(小端或大端)應跳過編寫BOM的過程。 當然,如果沒有BOM,則解碼器需要知道期望哪個字節序。
\\xff\\xfe8\\x06
確實包含\\x38
! 8
== \\x38
關於第二個問題,為了避免出現BOM表,如果您明確地知道了字節序(使用UTF-16BE
或UTF-16LE
編解碼器),則不會打印BOM表。
但是,正確的做法是使用文件包裝器為您處理編碼和解碼,並在程序中使用unicode。 在Python 3.0中, open
內置函數可以做到這一點:
fp = open(filename, 'w', encoding='utf-16')
fp.write(u'write one line\n')
fp.write(u'write another line\n')
fp.close()
在Python 2.x中,使用編解碼器包裝器:
fp = codecs.open(filename, 'w', 'utf-16')
fp.write(u'write one line\n')
fp.write(u'write another line\n')
fp.close()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.