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

45 投票
8 回答
18889 浏览
提问于 2025-04-15 16:38

在Python 3.x中,一个字符串是由Unicode的数字组成的。(下面有语言参考的引用。)那么,Unicode字符串的内部表示是什么呢?是UTF-16吗?

字符串对象的内容是Unicode编码单元。一个Unicode编码单元由一个字符串对象表示,可以是一个16位或32位的值,用来表示一个Unicode数字(这个数字的最大值可以在sys.maxunicode中找到,具体取决于Python在编译时的配置)。在Unicode对象中可能会出现代理对,这会被当作两个独立的内容来处理。

8 个回答

26

在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。

37

在Python 3.3版本中,内部的字符串表示方式会发生变化,这个变化是根据一个叫做PEP 393的提案来实现的。新的表示方式会选择一种或几种编码方式,比如ascii、latin-1、utf-8、utf-16和utf-32,主要是为了让字符串的存储更加紧凑。

在与旧的API(这些API只在Windows上存在,因为它们使用的wchar_t是两个字节)进行交互时,才会自动转换成代理对;而Python字符串本身会保持不变。你可以查看发布说明了解更多信息。

-1

在Python 2.X和3.X之间,Unicode的内部表示方式没有任何变化。

它绝对不是UTF-16。UTF-某某是以字节为基础的外部表示方式。

每个字符(包括普通字符和替代字符等)都有一个从0到2的21次方的数字,这个数字叫做“序号”。

其实,你引用的文档已经说得很清楚了。大多数Python的二进制文件使用的是16位的序号,这样的话你只能使用基本多语言平面(“BMP”),除非你想搞一些替代字符(如果你找不到你的毛衣,或者你的钉床正在除锈,那就很方便了)。如果你想使用完整的Unicode字符集,最好选择“宽构建”(32位宽)。

简单来说,Unicode对象的内部表示是一个16位无符号整数的数组,或者是一个32位无符号整数的数组(只使用21位)。

撰写回答