6

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

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

哪个打印:

<type 'str'> á

但我认为声明为 utf-8 的 Python 模块中的所有字符串文字都应该自动unicode属于str. 我错过了什么还是这是正确的行为?

为了得到a一个 unicode 字符串,我使用:

a = u"á"

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

4

3 回答 3

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'نص عربي')
于 2013-11-04T15:35:11.230 回答
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。

于 2013-11-04T15:26:48.770 回答
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。

注意 python3 中的所有字符串都是 unicode。

于 2013-11-04T15:30:21.347 回答