我對Unicode的十六進制表示感到困惑。 我有一個示例文件,其中包含一個數學整數符號字符。那就是U + 222B 如果我在vi中捕獲文件或編輯它,我會顯示一個整數符號。 該文件的十六進制轉儲顯示其十六進制內容是88e2 0aab關於unicode表示的困惑
在python中,我可以創建一個整數unicode字符並在我的終端和積分符號上打印p渲染。
>>> p=u'\u222b'
>>> p
u'\u222b'
>>> print p
∫
讓我困惑的是我可以打開一個帶有積分符號的文件,得到積分符號,但十六進制內容是不同的。
>>> c=open('mycharfile','r').read()
>>> c
'\xe2\x88\xab\n'
>>> print c
∫
一個是一個Unicode對象,一個是純字符串,但什麼是顯然是相同的字符兩個十六進制代碼之間的關係?我將如何手動將一個轉換爲另一個?
'0x222b' = 8747是Unicode中與整數符號「∫」關聯的代碼點的整數值。當您將文本寫入文件或通過線路發送文件時,必須始終將其串行化爲位 - 通常,八位位組(字節)是此處的首選單位。 0xe2「,」0x88「,」0xab「(或二進制中的」0b11100010「,」0b10001000「,」0b10101011「)是UTF-8編碼(http://en.wikipedia.org/wiki/UTF- 8)的'0x222b'。順便說一句,第一個字節中的三個前導'1'告訴你這個碼點是用三個字節編碼的:UTF-8既是可變寬度也是'同步'。 – flow
強制性:http://bit.ly/unipain – Daenyth
這種微小的鏈接看起來很有前途。還有一點應該指出,Py3中的Unicode處理比以前在Py2中更加明智 - 在決定使用哪個Python版本時,這個因素應該大量權衡。令人遺憾的是,Py2和Py3之間存在着不合理的分歧,第三方庫支持滯後。 Py3的亮點在於舊的「ASCII字符串」消失了;你總是處理字節(編碼)或(Unicode)文本(解碼)的緩衝區。它只是改變了概念/命名的東西,但是編程很多都是關於概念和命名的。 – flow