这些字符串在Python解释器中是如何内部表示的?我不明白

5 投票
1 回答
912 浏览
提问于 2025-04-17 15:39
# -*- coding: utf-8 -*-

a = 'éáűőúöüó€'
print type(a)    # <type 'str'>
print a          # éáűőúöüó€
print ord(a[-1]) # 172

为什么这个能正常工作呢?难道不应该出现一个 SyntaxError: Non-ASCII character '\xc3' in file ... 的错误吗?字符串里面有unicode字符。

当我在前面加上 u 的时候,结果就不一样了:

# -*- coding: utf-8 -*-

a = u'éáűőúöüó€'
print type(a)    # <type 'unicode'>
print a          # éáűőúöüó€
print ord(a[-1]) # 8364

这是为什么呢?在Python内部表示上有什么区别?我怎么才能自己看到这些呢? :)

1 个回答

11

字符串中有 Unicode 字面量。

其实没有。字符串中存的是字节。Python 只是使用你在编辑器中保存到磁盘的字节,这些字节是在你创建文件时生成的。

当你在字符串前加上 u'' 时,你是在告诉 Python 你要创建一个 unicode 对象。这样一来,Python 就会关注你在源文件顶部指定的编码,并根据这个编码把源文件中的字节 解码 成一个 unicode 对象。

无论是哪种情况,你的编辑器都是把一系列字节保存到文件中。比如说,字符 在 UTF-8 编码下占用 三个 字节,十六进制表示为 E282AC。字节串中的最后一个字节是 AC,换算成十进制就是 172。解码这最后三个字节为 UTF-8 后,它们一起变成了 Unicode 代码点 U+20AC,十进制是 8364。

你真的应该了解一下 Python 和 Unicode 的相关知识:

撰写回答