unicode如何在Python内部表示?

Nis*_*ant 15 python string unicode python-internals

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

例如,我可以将'abc'其视为内存中的等效ASCII字节.整数可以被认为是2的恭维表示.但是u'\u2049',即使UTF-8'\xe2\x81\x89'-3字节长的形式表示,如何可视化u'\u2049'内存中的文字代码点?

是否有特定的方式存储在内存中?Python 2和Python 3是否以不同方式对待它?

对于任何好奇的人来说,很少有相关问题

1)这些字符串如何在Python解释器内部表示?我不明白

2)Python 3.x中字符串的内部表示是什么

Mar*_*ers 21

我假设您想了解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:灵活字符串表示.


*从技术上讲,UCS-2版本使用UTF-16,因为非BMP字符使用UTF-16代理来编码为4字节(每个2个UTF-16字符).但是,Python文档仍然将其称为UCS2.

这确实会导致意外行为,例如len()非BMP unicode字符串的长度超过包含的字符数.

  • 要知道您是否具有"窄"(UCS2)或"宽"(UCS4)构建,请检查sys.maxunicode.65535表示窄,1114111表示宽. (2认同)