这些字符串如何在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内部表示形式之间有什么区别?我自己怎么看?:)
问题答案:
字符串中包含Unicode文字
不是,没有。字符串中有字节。在创建文件时,Python会将编辑器保存到磁盘的字节简单化。
当在字符串前面加上前缀时u''
,会向python发出信号,表示您正在创建一个unicode
对象。Python现在会注意您在源文件顶部指定的编码,并且它会根据您指定的编码将源文件中的字节
解码 为一个unicode
对象。
在这两种情况下,您的编辑器都将一系列字节保存到文件中,对于€
字符来说,UTF-8编码是 三个
字节,以十六进制表示为E282AC。因此,字节字符串中的最后一个字节为AC,即十进制为172。一旦将最后3个字节解码为UTF-8,它们将一起成为Unicode代码点U
+ 20AC,即十进制的8364。
您确实应该阅读Python和Unicode:
-
Ned Batchelder的实用Unicode
-
每个软件开发人员绝对,肯定必须绝对了解Unicode和字符集(无借口!)作者:Joel Spolsky