簡體   English   中英

Python中的Unicode-僅是UTF-16?

[英]Unicode in Python - just UTF-16?

我在Python世界中感到很高興,因為當我需要向用戶輸出某些內容時,我正在使用Unicode並以UTF-8編碼進行所有操作。 然后,我的一位同事向我發送了有關UTF-8的這篇文章 ,這讓我感到困惑。

本文的作者多次指出UCS-2(Python使用的Unicode表示法)與UTF-16是同義詞。 他甚至直接說Python將UTF-16用於內部字符串表示。

作者還承認自己是Windows愛好者和開發人員,並指出MS多年來處理字符編碼的方式使該小組最困惑,所以也許這只是他自己的困惑。 我不知道...

有人可以解釋一下Python中UTF-16與Unicode的狀態是什么嗎? 它們是同義詞嗎?如果不是,則以什么方式?

Python中Unicode字符串(從2.2到3.2的版本)的內部表示形式取決於Python是在模式還是模式下編譯的。 大多數Python版本都是狹窄的(您可以使用sys.maxunicode進行檢查-狹窄版本為65535,寬版本為1114111)。

對於廣泛的構建,字符串在內部是4字節寬字符的序列,即,它們使用UTF-32編碼。 所有代碼點的長度正好是一個寬字符。

對於狹窄的構建,字符串是使用UTF-16在內部由2個字節寬的字符組成的序列。 BMP以外的字符(代碼點U + 10000及以上)使用通常的UTF-16代理對存儲:

>>> q = u'\U00010000'
>>> len(q)
2
>>> q[0]
u'\ud800'
>>> q[1]
u'\udc00'
>>> q
u'\U00010000'

請注意,UTF-16和UCS-2不相同。 UCS-2是固定寬度的編碼:每個代碼點編碼為2個字節。 因此,UCS-2 無法編碼超出BMP的代碼點。 UTF-16是可變寬度編碼; BMP外部的代碼點使用一對稱為代理對的字符進行編碼。


請注意,隨着PEP 393的實施,所有這些都在3.3中進行了更改。 現在,Unicode字符串使用足以容納最大代碼點的字符來表示-ASCII字符串為8位,BMP字符串為16位,否則為32位。 當使用許多僅ASCII的字符串時,這消除了寬/窄分隔,還有助於減少內存使用。

暫無
暫無

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

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