2

潜入 Python

在 Python 3 中,所有字符串都是 Unicode 字符序列。不存在以 UTF-8 编码的 Python 字符串或编码为 CP-1252 的 Python 字符串之类的东西。“这个字符串是 UTF-8 吗?” 是一个无效的问题。UTF-8 是一种将字符编码为字节序列的方法。如果您想获取一个字符串并将其转换为特定字符编码的字节序列,Python 3 可以帮助您。如果您想获取一个字节序列并将其转换为字符串,Python 3 也可以帮助您。字节不是字符;字节是字节。字符是一种抽象。字符串是这些抽象的序列。

我不明白作者的意思。

当我说s = 'hello',如何在s内部编码?当然它必须使用一些使用一些编码。他说所有字符串都是 Unicode 字符序列。但是每个字符有多少字节呢?这个字符串是 UTF-8 吗?为什么他会说:“没有以 UTF-8 编码的 Python 字符串之类的东西”。

我了解 Python 提供了将 Python“字符串”转换为一系列字节的功能,这些字节可由使用该编码的另一个软件读取。它还支持将一系列字节转换为 Python“字符串”。现在这个“字符串”的内部表示让我感到困惑。

4

3 回答 3

4

当我说 s = 'hello' 时,s 是如何在内部编码的?当然它必须使用一些使用一些编码。

这取决于。坦白说,没关系。CPython 现在使用灵活的字符串表示,一个美妙的空间和时间优化。但你不应该在意,因为这无关紧要。

他说所有字符串都是 Unicode 字符序列。但是每个字符有多少字节呢?

不知道。这取决于。在这种特殊情况下,它可能是 Latin-1(1 字节)(使用 CPython 时)。

这个字符串是 UTF-8 吗?

不。

为什么他会说:“没有以 UTF-8 编码的 Python 字符串之类的东西”。

因为它是一系列 Unicode 代码点。如果您将编码与字符串混淆(因为其他语言经常强迫您这样做),您可能会认为'Jalape\xc3\xb1o''Jalapeño',因为在 UTF-8 中字节序列'\xc3\xb1o'表示'ñ'. 但事实并非如此,因为字符串没有内在编码,就像 number100是 number一样100,not 4,无论你用二进制、十进制还是一元表示它。

他这么说是因为人们来自只有表示字符串的字节的语言,他们认为“但是这是如何编码的”,就好像他们必须自己解码一样。这就像携带 1 和 0 的列表而不是能够使用数字,并且您必须告诉每个函数您使用的是什么字节序。

我了解 Python 提供了将 Python“字符串”转换为一系列字节的功能,这些字节可由使用该编码的另一个软件读取。它还支持将一系列字节转换为 Python“字符串”。现在这个“字符串”的内部表示让我感到困惑。

希望它不再是:)。


如果这让您感到困惑,我推荐这个问题,部分原因是有人称我的答案“非常全面”¹,但也因为 Steven D'Aprano 已将他的 Python 邮件列表中的一个优秀作品张贴在那里 - 他和我从列表中回答并有我们的文字贴在上面。

如果你想知道为什么它是相关的,我会引用:

因此,您引用的人在谈论“编码字符串”时会引起混淆,他应该明确表示他的意思是一串字节,或者根本不提及字符串一词。

这不正是你的困惑吗?

¹从技术上讲,他将另一个答案称为“另一个非常全面的答案”,但这暗示了我刚才所说的;)。

于 2013-09-20T11:16:38.843 回答
4

作者比较了 Python 2 和 3 中的字符串。在 Python 2 中,字符串被表示为字节数组,因此在处理非 ASCII 字符时引入了很多问题。程序员必须始终跟踪其应用程序中字符串的当前编码(例如 HTML 页面上的文本编码)。在 Python 2.x 中尝试通过引入 Unicode 对象来解决它:

s  = 'text'    # string/byte array object 
un = u'text'   # unicode object

但是许多应用程序仍然使用普通的旧式字符串。

因此,在 Python 3 中,决定将字符串(使它们全部为 Unicode)和字节数组分开。因此,在 Python 3 中,我们有:

s = 'text'                             # string/unicode object
b = bytes([0xA2,0x01,0x02,0x03,0x04])  # byte array object
于 2013-09-20T09:59:46.973 回答
0

Python 在内部对 unicode 字符串使用 UCS-2 或 UCS-4 编码(至少在 Python 2.x 中)。

于 2013-09-20T09:44:42.427 回答