簡體   English   中英

使用 UTF-8 編碼 unicode

[英]encoding unicode using UTF-8

在 Python 中,如果我輸入

euro = u'\u20AC'
euroUTF8 = euro.encode('utf-8')
print(euroUTF8, type(euroUTF8), len(euroUTF8))

輸出是

('\xe2\x82\xac', <type 'str'>, 3)

我有兩個問題: 1. 看起來 euroUTF8 編碼超過 3 個字節,但是如何獲取其二進制表示以查看它包含多少位? 2. '\\xe2\\x82\\xac'中的'x' '\\xe2\\x82\\xac'是什么意思? 我不認為'x'是一個十六進制數。 為什么有三個'\\'

在 Python 2 中, print是一個語句,而不是一個函數。 您正在此處打印一個元組 通過刪除(..)打印各個元素:

>>> euro = u'\u20AC'
>>> euroUTF8 = euro.encode('utf-8')
>>> print euroUTF8, type(euroUTF8), len(euroUTF8)
€ <type 'str'> 3

現在您將 3 個單獨的對象作為字符串寫入 stdout; 我的終端恰好被配置為將寫入它的任何內容解釋為 UTF-8,因此字節正確導致顯示歐元符號。

\\x<hh>序列是Python 字符串文字轉義序列(請參閱參考文檔); 它們是應用於包含非 ASCII、不可打印字節的字符串的repr()的默認輸出。 在交互式解釋器中回顯值時,您將看到相同的內容:

>>> euroUTF8
'\xe2\x82\xac'
>>> euroUTF8[0]
'\xe2'
>>> euroUTF8[1]
'\x82'
>>> euroUTF8[2]
'\xac'

它們為您提供 ASCII 安全的調試輸出。 所有 Python 標准庫容器的內容都使用這種格式; 包括列表、元組和字典。

如果要格式化以查看組成這些值的位,請使用ord()函數將每個字節轉換為整數,然后將整數格式化為二進制:

>>> ' '.join([format(ord(b), '08b') for b in euroUTF8])
'11100010 10000010 10101100'
  1. 每種編碼中的每個字母都使用不同的位數表示。 UTF-8 是 8 位編碼,因此無需獲取二進制表示即可了解每個字符的每個位計數。 (如果您仍想呈現位,請參閱 Martijn 的回答。)

  2. \\x表示后面的值是一個字節。 所以 x 不是你應該轉換或讀取的十六進制數字。 它標識了您感興趣的以下值。 \\用於轉義x ,因為它們不是值的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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