为什么要在python中通过string来声明unicode?

我还在学Python,我有一个疑问:

在Python 2.6.x中,我通常在文件头中声明这样的编码(如PEP 0263 )

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

之后,我的string照常写:

 a = "A normal string without declared Unicode" 

但每次我看到一个python项目代码,编码没有在头上声明。 相反,它是这样的每一个string声明:

 a = u"A string with declared Unicode" 

有什么不同? 这是什么目的? 我知道Python 2.6.x默认设置ASCII编码,但是它可以被头声明覆盖,那么每个string声明有什么意义呢?

附录:似乎我把文件编码与string编码混在一起。 感谢您解释:)

和其他人一样,这是两码事。

当你指定# -*- coding: utf-8 -*- ,你告诉Python你保存的源文件是utf-8 。 Python 2的默认值是ASCII(对于Python 3,它是utf-8 )。 这只影响解释器如何读取文件中的字符。

一般来说,不pipe编码是什么,在你的文件中embedded高的Unicode字符可能不是最好的办法。 你可以使用stringunicode转义,其中任何一种编码工作。


当你在前面用u声明一个string时 ,如u'This is a string' ,它告诉Python编译器该string是Unicode,而不是字节。 这个翻译工作大部分是透明的。 最明显的区别是你现在可以在string中embeddedunicode字符(也就是说, u'\u2665'现在是合法的)。 您可以使用from __future__ import unicode_literals使其成为默认值。

这只适用于Python 2; 在Python 3中默认是Unicode,并且你需要在前面指定一个b (比如b'These are bytes' ,以声明一个字节序列。

正如其他人所说, # coding:指定源文件保存的编码。下面是一些例子来说明这一点:

保存在磁盘上的文件为cp437(我的控制台编码),但没有声明编码

 b = 'über' u = u'über' print b,repr(b) print u,repr(u) 

输出:

  File "C:\ex.py", line 1 SyntaxError: Non-ASCII character '\x81' in file C:\ex.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details 

# coding: cp437输出文件# coding: cp437添加:

 über '\x81ber' über u'\xfcber' 

起初,Python不知道编码,抱怨非ASCII字符。 一旦知道了编码,字节串就得到了实际上在磁盘上的字节。 对于Unicodestring,Python读取\ x81,知道在cp437中是一个ü ,并将其解码为U + 00FC的Unicode编码点。 当打印字节string时,Python将hex值81直接发送到控制台。 当打印Unicodestring时,Python正确地检测到我的控制台编码为cp437,并将Unicodeü转换为ü的cp437值。

下面是以UTF-8格式声明和保存的文件:

 ├╝ber '\xc3\xbcber' über u'\xfcber' 

在UTF-8中, ü被编码为hex字节C3 BC ,因此字节string包含这些字节,但Unicodestring与第一个示例相同。 Python读取两个字节并正确解码。 Python不正确地打印字节string,因为它将代表ü的两个UTF-8字节直接发送到我的cp437控制台。

这里的文件被声明为cp437,但保存在UTF-8中:

 ├╝ber '\xc3\xbcber' ├╝ber u'\u251c\u255dber' 

字节string仍然获得磁盘上的字节(UTF-8hex字节C3 BC ),但将它们解释为两个cp437字符,而不是单个UTF-8编码字符。 这两个字符翻译成Unicode代码点,一切打印不正确。

这不会设置string的格式; 它设置文件的格式。 即使有这个头, "hello"是一个字节string,而不是一个Unicodestring。 为了使它成为Unicode,你将不得不在所有地方都使用u"hello" 。 头文件只是读取.py文件时使用的格式提示。

头文件定义是定义代码本身的编码,而不是运行时产生的string。

在python脚本中join一个非ascii字符,如2,不用utf-8头文件定义会抛出一个警告错误http://www.freeimagehosting.net/uploads/1ed15124c4.jpg

如果您使用的是Python 2,请添加: from __future__ import unicode_literals