簡體   English   中英

Python UTF-16編碼十六進制表示

[英]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-16BEUTF-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM