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

5
# -*- 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中的内部表示有什么区别?我如何自己查看它?:)


为什么在字节字符串中有字节会导致语法错误? - Wooble
好的,那么第一个字符串是什么,第二个字符串是什么? - kissgyorgy
2
第一个是包含文件中UTF-8字节的str对象。第二个是通过解码UTF-8形成的unicode对象。使用repr()函数查看它们之间的区别。 - Wooble
2
在第一个案例中检查字符串的长度。 - JBernardo
6
为什么会有人踩这个问题?这似乎是一个合理的问题。要更清晰地提问需要知道答案。 - Jon-Eric
2
FYI,这在Python 3中已经修复。 - Jon-Eric
1个回答

10

该字符串中含有Unicode字面量

不,它不是。该字符串包含字节。当您创建文件时,Python只使用编辑器保存到磁盘的字节。

当您在字符串前加上,这意味着您正在创建一个unicode对象。Python现在会根据您在源文件顶部指定的编码,将源文件中的字节解码为unicode对象。

在两种情况下,您的编辑器都将一系列字节保存到文件中,对于字符,UTF-8编码为三个字节,以十六进制表示为E282AC。字节字符串中的最后一个字节是AC,或十进制数172。一旦您将最后3个字节解码为UTF-8,它们将一起成为Unicode代码点U+20AC,即十进制数8364。

您确实应该阅读有关Python和Unicode的资料:

  • Python Unicode HOWTO,点击链接

  • Ned Batchelder的实用Unicode指南,点击链接

  • Joel Spolsky的《软件开发人员必须了解的Unicode和字符集绝对最少知识》(无借口!),点击链接


1
哇,太棒了!谢谢你的答案!我已经阅读了第一个链接,但还是不明白其中的区别。现在我完全明白了!:) - kissgyorgy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接