我试图理解python 3中的字符串表示形式。我在网站上看到了各种各样的解释,从Mark Lutz的学习python的书中可以看出,在python 3中,str对象存储为Unicode代码点。引用这本书,“非Unicode代码序列是8位字节的序列,在可能的情况下会打印ASCII字符,而Unicode字符串是Unicode代码点的序列。”
我理解上面引用的第一部分,但我不太理解第二部分。怎样将字符序列(例如当我在控制台中键入S ='spam'时)存储为“ Unicode代码点”?
我相信代码点仅仅是对应于字符的数字,但是将您从该数字转换为二进制表示形式的实际编码取决于您选择使用的系统,例如utf-8或utf-32。如果是这样(如果不是,请更正!),然后将我的变量S保存到内存中,计算机必须在某个时候将“垃圾邮件”转换为某些字节序列。所以我将某些字符转换为二进制,这是编码的一种形式?我看过另一篇文章,其中解释说python不做自己的编码。
我不明白然后如何将我的变量S不经过某种形式的编码而保存到内存中(不仅仅是像书中解释的那样将数据存储为代码点)?
谢谢。
答案 0 :(得分:1)
您的引用中没有提到Unicode字符串的内存表示形式。它说“ Unicode字符串是 Unicode代码点的序列”,而不是“存储为”。
此引号描述的是Unicode字符串的含义,而不是其内存中的表示形式。 Python有很多 lot 内部表示Unicode字符串的方式,包括ASCII,UTF-8和UTF-32。它甚至可以在同一个字符串对象中存储多个表示形式。特别是PyUnicode_AsUTF8AndSize会导致字符串存储辅助UTF-8表示形式,除非该字符串是ASCII(已经是有效的UTF-8),并且字符串也可能存储了wchar_t表示形式。
所有内存表示形式都是实现细节,并且随时可能更改。如果要查看内部表示,请查看Include/unicodeobject.h