Unicode字符串如何在Python的内存中按字面表示?
例如,我可以'abc'在内存中可视化为等效的ASCII字节。整数可以认为是2的恭维表示形式。但是u'\u2049',即使UTF-8以'\xe2\x81\x89'3个字节长表示,我如何u'\u2049'在内存中可视化原义代码点?
'abc'
u'\u2049'
UTF-8
'\xe2\x81\x89'
是否有将其存储在内存中的特定方法?Python 2和Python 3是否有区别?
我假设您想了解CPython(标准实现)。Python 2和Python 3.0-3.2对Unicode字符使用UCS2 *或UCS4,这意味着 每个字符 将使用2个字节或4个字节。选择哪个是编译时选项。
\u2049然后根据您系统的本机字节顺序以及是否选择了UCS2或UCS4将其表示为\x49\x20or\x20\x49或\x49\x20\x00\x00or\x00\x00\x20\x49或or。Unicode字符串中的ASCII字符仍然每个字符使用2或4个字节。
\u2049
\x49\x20
\x20\x49
\x49\x20\x00\x00
\x00\x00\x20\x49
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字符串上的字符长于所包含的字符数。
len()