Cau*_*ons 5 python unicode utf-8 unicode-literals
我有一个带有utf-8标头的dummie Python模块,如下所示:
# -*- coding: utf-8 -*-
a = "á"
print type(a), a
Run Code Online (Sandbox Code Playgroud)
哪个印刷品:
<type 'str'> á
Run Code Online (Sandbox Code Playgroud)
但是我认为声明为utf-8的Python模块中的所有字符串文字都应该是自动类型unicode的str.我错过了什么或者这是正确的行为吗?
为了获得a作为unicode字符串,我使用:
a = u"á"
Run Code Online (Sandbox Code Playgroud)
但这似乎不是很"礼貌",也不实用.有更好的选择吗?
小智 6
# -*- coding: utf-8 -*-
Run Code Online (Sandbox Code Playgroud)
不会使字符串文字Unicode.举个例子,我有一个带有阿拉伯语注释和字符串的文件,文件是utf-8:
# ??? ????? ????
print type('?? ????')
Run Code Online (Sandbox Code Playgroud)
如果我运行它会抛出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
Run Code Online (Sandbox Code Playgroud)
所以为了允许这个,我必须添加该行来告诉解释器该文件是UTF-8编码的:
# -*-coding: utf-8 -*-
# ??? ????? ????
print type('?? ????')
Run Code Online (Sandbox Code Playgroud)
现在它运行正常,但它仍然打印,<type 'str'>除非我使字符串Unicode:
# -*-coding: utf-8 -*-
# ??? ????? ????
print type(u'?? ????')
Run Code Online (Sandbox Code Playgroud)
不,顶部的编解码器只通知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
Run Code Online (Sandbox Code Playgroud)
如果Python的行为方式符合您的预期,那么您将无法使用包含非ASCII字节值的字节字符串值.
如果您的终端配置为显示UTF-8值,则打印UTF-8编码的字节字符串将看起来"正确",但仅凭运气编码匹配.
获取unicode值的正确方法是使用unicode文字或以其他方式生成unicode(从字节字符串解码,将整数代码点转换为unicode字符等):
unicode_snowman = '\xe2\x98\x83'.decode('utf8')
unicode_snowman = unichr(0x2603)
Run Code Online (Sandbox Code Playgroud)
在Python 3中,编解码器也适用于如何解释变量名称,因为您可以在名称中使用ASCII范围之外的字母和数字.Python 3中的默认编解码器是UTF-8,而不是Python 2中的ASCII.