Python 3.x 中字符串的内部表示是什么
在Python 3.x中,一个字符串是由Unicode的数字组成的。(下面有语言参考的引用。)那么,Unicode字符串的内部表示是什么呢?是UTF-16吗?
字符串对象的内容是Unicode编码单元。一个Unicode编码单元由一个字符串对象表示,可以是一个16位或32位的值,用来表示一个Unicode数字(这个数字的最大值可以在sys.maxunicode中找到,具体取决于Python在编译时的配置)。在Unicode对象中可能会出现代理对,这会被当作两个独立的内容来处理。
8 个回答
在Python 3.3及以上版本中,字符串的内部表示方式会根据字符串的内容而不同,可以是latin-1、UCS-2或UCS-4,具体情况可以参考PEP 393。
而在之前的Python版本中,字符串的内部表示方式则取决于Python的构建选项。Python可以通过设置标志值--enable-unicode=ucs2
或--enable-unicode=ucs4
来构建。ucs2
版本实际上是使用UTF-16作为它们的内部表示方式,而ucs4
版本则使用UCS-4 / UTF-32。
在Python 2.X和3.X之间,Unicode的内部表示方式没有任何变化。
它绝对不是UTF-16。UTF-某某是以字节为基础的外部表示方式。
每个字符(包括普通字符和替代字符等)都有一个从0到2的21次方的数字,这个数字叫做“序号”。
其实,你引用的文档已经说得很清楚了。大多数Python的二进制文件使用的是16位的序号,这样的话你只能使用基本多语言平面(“BMP”),除非你想搞一些替代字符(如果你找不到你的毛衣,或者你的钉床正在除锈,那就很方便了)。如果你想使用完整的Unicode字符集,最好选择“宽构建”(32位宽)。
简单来说,Unicode对象的内部表示是一个16位无符号整数的数组,或者是一个32位无符号整数的数组(只使用21位)。