这些字符串在Python解释器中是如何内部表示的?我不明白
# -*- 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 的相关知识: