声明为utf-8的模块中的Python unicode字符串文字

时间:2013-11-04 15:24:09

标签: python unicode utf-8 unicode-literals

我有一个带有utf-8标头的dummie Python模块,如下所示:

# -*- coding: utf-8 -*-
a = "á"
print type(a), a

打印哪些:

<type 'str'> á

但是我认为声明为utf-8的Python模块中的所有字符串文字都应该自动为unicode类型,为str。我错过了什么或者这是正确的行为吗?

为了将a作为unicode字符串,我使用:

a = u"á"

但这似乎不是很“礼貌”,也不实用。有更好的选择吗?

3 个答案:

答案 0 :(得分:6)

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

不会使字符串文字为Unicode。举个例子,我有一个带有阿拉伯语注释和字符串的文件,文件是utf-8:

# هذا تعليق عربي
print type('نص عربي')

如果我运行它会抛出SyntaxError异常:

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

所以为了允许这个,我必须添加该行来告诉解释器该文件是UTF-8编码的:

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

# هذا تعليق عربي
print type('نص عربي')

现在它运行正常,但它仍会打印<type 'str'>,除非我创建字符串Unicode:

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

# هذا تعليق عربي
print type(u'نص عربي')

答案 1 :(得分:5)

不,顶部的编解码器告知Python如何解释源代码,并使用该编解码器来解释Unicode文字。 将文字字节串转换为unicode值。正如PEP 263所述:

  

本PEP建议引入一种语法来声明编码       一个Python源文件。然后,编码信息被使用       Python解析器使用给定的编码来解释文件。最       值得注意的是这增强了对Unicode文字的解释       源代码,可以编写Unicode文字       使用例如UTF-8直接在Unicode识别编辑器中。

强调我的。

没有编解码器声明,Python不知道如何解释非ASCII字符:

$ cat /tmp/test.py 
example = '☃'
$ python2.7 /tmp/test.py 
  File "/tmp/test.py", line 1
SyntaxError: Non-ASCII character '\xe2' in file /tmp/test.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

如果Python的行为方式符合您的预期,那么您将无法识别包含非ASCII字节值的字节串值。

如果您的终端配置为显示UTF-8值,那么打印UTF-8编码的字节字符串将看起来“正确”,但这只是因为编码匹配的好运。

获取unicode值的正确方法是使用unicode文字或以其他方式生成unicode(从字节字符串解码,将整数代码点转换为unicode字符等):

unicode_snowman = '\xe2\x98\x83'.decode('utf8')
unicode_snowman = unichr(0x2603)

在Python 3中,编解码器也适用于如何解释变量名称,因为您可以在名称中使用ASCII范围之外的字母和数字。 Python 3中的默认编解码器是UTF-8,而不是Python 2中的ASCII。

答案 2 :(得分:2)

不,这只是源代码编码。请参阅http://www.python.org/dev/peps/pep-0263/

  

要定义源代码编码,必须使用魔术注释   作为第一个或第二个放入源文件   文件中的行,例如:

      # coding=<encoding name>

or (using formats recognized by popular editors)

      #!/usr/bin/python
      # -*- coding: <encoding name> -*-

or

      #!/usr/bin/python
      # vim: set fileencoding=<encoding name> :

这并不能使所有文字unicode只指出unicode文字应该如何解码。

应该使用unicode函数或u前缀将文字设置为unicode。

N.B。在python3中,所有字符串都是unicode。