2009-12-03 25 views
20

在Python 3.x中,一個字符串由Unicode序數的項組成。 (請參見下面的語言參考中的引用。)Unicode字符串的內部表示形式是什麼?它是UTF-16嗎?什麼是Python 3.x中字符串的內部表示形式

字符串對象的項目是 Unicode代碼單元。甲Unicode代碼 單元由字符串對象一項的 ,可以容納所表示無論是 16位或表示 Unicode的序數的32位值(序號是 sys.maxunicode給出 的最大值,並取決於在編譯時如何配置Python )。 替代對可能存在於 Unicode對象中,並且將作爲兩個單獨的項目報告爲 。

+1

這有什麼關係?通過了解內部表示解決了什麼問題? – 2009-12-03 11:09:50

+21

我覺得我通過問錯問題來了解更多。 – thebat 2009-12-04 20:00:40

+2

這是一個有效的問題,如果除了知道'ord('העטלף')'的值是什麼之外沒有別的原因。 – dotancohen 2014-09-11 11:52:54

回答

5

Python 2.X和3.X之間的Unicode內部表示沒有任何變化。

這絕對不是UTF-16。 UTF-anything是一種面向字節的EXTERNAL表示。

每個代碼單元(字符,替代等)已被分配從範圍內的數(0,2 ** 21)。這被稱爲「序數」。

真的,你引用的文件說明了這一切。大多數Python二進制文件都使用16位序號,這將限制您使用基本多語言平面(「多語言平面」),除非您想要使用替代品(如果您找不到頭髮襯衫,而且您的指甲牀不能脫落,生鏽)。爲了處理完整的Unicode代碼庫,你更喜歡「寬版」(32位寬)。

簡言之,在一個unicode對象的內部表示的是16位無符號整數的數組,或(僅使用21位)的32位無符號整數數組。

+15

「以16位整數存儲unicode代碼」稱爲「UCS-2」。用32位整數做同樣的事情是UCS-4。 – 2009-12-03 09:36:16

+0

我不確定這個過程如何被稱爲「UCS2」或「garbelfratzing」或任何有助於OP的理解。 – 2009-12-03 19:55:28

+13

用正確的名字打電話給你,給你一些東西來標記你的新理解,並保持它,直到你再次遇到。我們不能無言地說話。 – u0b34a0f6ae 2009-12-03 22:54:19

1

這取決於:看here。就內部表示而言,Python 3仍然如此。

0

我覺得,它很難判斷UTF-16,這僅僅是一個16個字序列,Python的字符串對象之間的區別。

而且如果Python是使用Unicode = UCS4選項編譯,將UTF-32和Python字符串之間進行比較。

所以,最好考慮一下,它們屬於不同的類別,儘管你可以互相轉換。

5

看爲CPython的3.1.5的源代碼,在Include/unicodeobject.h

/* --- Unicode Type ------------------------------------------------------- */ 

typedef struct { 
    PyObject_HEAD 
    Py_ssize_t length;   /* Length of raw Unicode data in buffer */ 
    Py_UNICODE *str;   /* Raw Unicode buffer */ 
    long hash;     /* Hash value; -1 if not set */ 
    int state;     /* != 0 if interned. In this case the two 
           * references from the dictionary to this object 
           * are *not* counted in ob_refcnt. */ 
    PyObject *defenc;   /* (Default) Encoded version as Python 
            string, or NULL; this is used for 
            implementing the buffer protocol */ 
} PyUnicodeObject; 

的字符被存儲爲Py_UNICODE陣列。在大多數平臺上,我認爲Py_UNICODE#define d爲wchar_t

23

內部表示將在Python 3.3,它實現PEP 393改變。新的表示會選擇一個或幾個ascii,latin-1,utf-8,utf-16,utf-32,通常試圖獲得一個緊湊的表示。

到代理對的隱式轉換隻會在與傳統API(只存在於Windows上,其中wchar_t是兩個字節)交流時完成; Python字符串將被保留。這裏是release notes

+4

在我看來,像PEP 393一樣,內部表示是ASCII,Latin-1(UCS1),UCS2或UCS4中最緊湊的(給定一個特定的字符串)。 即:特別是不是utf-8/16/32。原因是:Python必須是恆定的時間來索引到一個字符串,因此字符必須是統一的大小,這是UCS的情況,但不是utf表示。 – gwideman 2014-03-13 10:58:07

+0

PEP 393表示這一切...... – 2015-11-08 23:52:36

+0

Latin-1是ASCII的超集,所以沒有理由將ASCII作爲選項之一。這些選項是(a)一致的8位,即拉丁-1,(b)一致的16位,即UCS2,或(c)一致的32位,即UCS4(與UTF-32相同)。值得注意地排除的是UTF-8和UTF-16,它們沒有每個代碼點的統一比特數 – JoelFan 2017-10-24 03:42:59

4

在Python 3.3及更高版本中,字符串的內部表示形式將取決於字符串,並且可以是Tobu所指出的ascii,latin-1,utf-8,utf-16,utf-32中的任何一種描述於PEP 393

對於以前的Pythons,內部表示取決於Python的構建標誌。 Python可以用標誌值--enable-unicode=ucs2--enable-unicode=ucs4構建。 ucs2的構建實際上是use UTF-16 as their internal representationucs4構建使用UCS-4/UTF-32。

+1

我對PEP393的閱讀是,內部表示從不是utf-8或任何其他編碼,每個代碼的字節數不一致 - 點(符號),並且正確的集合是:'Latin-1','UCS-2'或'UCS-4'。不知道我有這個權利。我讀過唯一的utf-8格式的輸入,或者在某些情況下緩存的輸出。 – 2016-02-05 18:59:54

相關問題