在Python源代码中使用UTF-8编码

461

考虑以下情况:

$ cat bla.py 
u = unicode('d…')
s = u.encode('utf-8')
print s
$ python bla.py 
  File "bla.py", line 1
SyntaxError: Non-ASCII character '\xe2' in file bla.py on line 1, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

我该如何在源代码中声明UTF-8字符串?


6
对我来说,“参见http://www.python.org/peps/pep-0263.html以获取详细信息”这句话很清楚。 - Lennart Regebro
2个回答

872
在Python 3中,UTF-8是默认的源编码(参见PEP 3120),因此Unicode字符可以在任何地方使用。
在Python 2中,你可以在源代码头部声明:
# -*- coding: utf-8 -*-
....

这在PEP 0263中有所描述。

然后您可以在字符串中使用UTF-8:

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

u = 'idzie wąż wąską dróżką'
uu = u.decode('utf8')
s = uu.encode('cp1250')
print(s)

8
现在出现了这个错误:"UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 1: ordinal not in range(128)"。 - Nullpoet
1
你不需要使用 unicode(),只需以 UTF-8 编码编写字符串即可。 - Michał Niklas
32
在Python 3之前的版本中,你需要在unicode字符串字面值前加上前缀“u”:some_string = u'idzie wąż wąską dróżką' - Anton Strogonoff
3
#!/usr/bin/env python

编码:utf-8

- warvariuc
不,声明是我所知道的唯一方法。许多编辑器可以使用代码模板,因此如果您打开新的Python,则会打开您喜欢的代码。 - Michał Niklas
显示剩余13条评论

92

不要忘记验证您的文本编辑器是否正确地将代码编码为UTF-8。

否则,您可能会遇到不被解释为UTF-8的不可见字符。


2
这对Python3有必要吗?我知道Python3假定代码中的所有文字都是Unicode。但它是否也假定源文件也是用UTF8编写的? - Ricardo Magalhães Cruz
1
@RicardoCruz 是的,我相信在Python 3中utf-8是默认编码。请参阅https://www.python.org/dev/peps/pep-3120/。 - Jonathan Hartley
@ricardo-cruz 在Python 3中,所有字符串都将是Unicode字符串,因此源代码的原始编码在运行时不会产生影响。
  1. PEP 3120 -- 将UTF-8作为默认源编码
  2. PEP 263 -- 定义Python源代码编码
- noobninja
@noobninja 感谢提供的链接:PEP 3120 确认源代码本身现在被假定为 UTF-8,而不仅仅是字符串。 - Ricardo Magalhães Cruz
26
使用 # coding: utf8 代替 # -*- coding: utf-8 -*- 更加易于记忆。 - show0k
“源代码的原始编码在运行时不会产生影响”是不正确的。Unicode字符串常量需要Python知道源文件的编码才能正确生成Unicode字符串。Python 3假定为UTF-8,因此如果源文件采用其他编码且存在非ASCII字符,则需要#coding - Mark Tolonen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接