unicode如何在Python内部表示?

时间:2014-09-27 21:28:09

标签: python string unicode python-internals

如何在Python的内存中字面表示Unicode字符串?

例如,我可以将'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

1 个答案:

答案 0 :(得分:18)

我假设您想了解标准实施CPython。 Python 2和Python 3.0-3.2使用UCS2 * 或UCS4作为Unicode字符,这意味着它使用2个字节或4个字节用于每个字符。选择哪一个是编译时选项。

然后

\u2049表示为\x49\x20\x20\x49\x49\x20\x00\x00\x00\x00\x20\x49,具体取决于系统的本机字节顺序以及UCS2或UCS4被选中了。 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 unicode字符串上的len()长度超过包含的字符数。