2014-09-27 70 views
8

Unicode字符串在Python的內存中如何字面表示?unicode如何在Python內部表示?

例如,我可以將'abc'想象爲其在內存中的等效ASCII字節。整數可以被認爲是2的恭維表示。然而,u'\u2049',即使在UTF-8中表示爲'\xe2\x81\x89' - 3個字節長,我如何可視化文字u'\u2049'代碼點在內存中?

是否有一種特定的方式存儲在內存中? Python 2和Python 3是否以不同的方式對待它?任何人都好奇

一些相關的問題:

1)How are these strings represented internally in Python interpreter ? I don't understand

2)What is internal representation of string in Python 3.x

回答

10

的Python 2和Python 3.0-3.2兼用UCS2 *或UCS4爲Unicode字符,這意味着它將使用2個字節或4個字節用於每個字符。選擇哪一個是編譯時選項。

\u2049取決於如果UCS2或UCS4被挑你的系統和字節順序上則表現爲要麼\x49\x20\x20\x49\x49\x20\x00\x00\x00\x00\x20\x49。 unicode字符串中的ASCII字符仍然每個字符使用2或4個字節。

Python 3.3切換到一個新的內部表示形式,使用表示字符串中所有字符所需的最緊湊形式。選擇1個字節,2個字節或4個字節。 ASCII和Latin-1文本每個字符只使用1個字節,其餘的BMP字符需要2個字節,之後使用4個字節。

請參閱PEP-393: Flexible String Representation以瞭解這些表示法的完整性。


*從技術上講在UCS-2的構建使用UTF-16,作爲非BMP字符使用UTF-16的替代物來編碼爲4個字節(2 UTF-16字符)的每個。但是,Python文檔仍將其稱爲UCS2。

這確實會導致意外的行爲,例如非BMP BMP Unicode字符串上的len()比包含的字符數更長。

+2

要知道您是否有「窄」(UCS2)或「寬」(UCS4)構建,請檢查sys.maxunicode。 65535指窄,1114111指寬。 – 2014-09-27 21:33:48

+0

我認爲在技術上,它是UTF-16或UTF-32,而不是UCS2或UCS4,因爲代理對在狹窄的版本中使用,因此它的UTF-16。 – 2014-09-27 21:36:03

+0

@NedBatchelder:的確,不知道爲什麼文檔仍然堅持使用UCS。 – 2014-09-27 21:36:44