我正在尝试理解 python 3 中的字符串表示形式。我在网站上看到了各种解释,并且从 Mark Lutz 的《学习 python》一书中了解到,在 python 3 中,str 对象存储为 Unicode 代码点。引用这本书,“非 Unicode 代码序列是 8 位字节的序列,在可能的情况下用 ASCII 字符打印,而 Unicode 字符串是 Unicode 代码点的序列”。
我理解上面引用的第一部分,但我不太理解第二部分。如何将字符序列(例如当我在控制台中输入 S = 'spam' 时)存储为“Unicode 代码点”?
我相信代码点只是与字符相对应的数字,但是从这个数字到二进制表示的实际编码取决于您选择使用的系统,例如 utf-8 或 utf-32 。如果这是真的(如果不是,请纠正我!),那么为了将我的变量 S 保存到内存中,计算机必须在某个时刻将“垃圾邮件”转换为某种字节序列。所以我从一些字符转为二进制,这是一种编码形式?我看过另一篇文章,其中解释了 python 不进行自己的编码。
我不明白如何在不进行某种形式的编码的情况下将我的变量 S 保存到内存中(而不是像书中解释的那样将数据存储为代码点)?
提前致谢。
最佳答案
您的引用没有提及 Unicode 字符串在内存中的表示形式。它说“Unicode 字符串是 Unicode 代码点序列”,而不是“存储为”。
这句话是对 Unicode 字符串含义的描述,而不是它在内存中的表示。 Python 有很多内部表示 Unicode 字符串的方法,包括 ASCII、UTF-8 和 UTF-32。它甚至可以将多个表示存储在同一个字符串对象中;特别是PyUnicode_AsUTF8AndSize将导致字符串存储辅助 UTF-8 表示形式,除非该字符串是 ASCII(已经是有效的 UTF-8),并且字符串还可能存储 wchar_t 表示形式。
所有内存表示都是实现细节,可能会发生变化。如果你想查看内部表示,请查看 Include/unicodeobject.h
关于python - 字符串如何存储为 'sequence of Unicode code points' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52897906/