如何在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
答案 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()
长度超过包含的字符数。