首先我们假设您想要支持 Python 2.7 和 3.5 版本(2.6 和 3.0 到 3.2 的处理方式略有不同)。
正如您已经阅读过的,setdefaultencoding
不鼓励,并且在您的情况下实际上不需要。
要编写处理 unicode 文本的跨平台代码,通常只需要在几个地方指定字符串编码:
- 在脚本顶部,shebang 下方
# -*- coding: utf-8 -*-
(仅当您的代码中有带有 unicode 文本的字符串文字时)
- 当您读取输入数据时(例如从文本文件或数据库)
- 当您输出数据时(再次从文本文件或数据库)
- 当您在代码中定义字符串文字时
以下是我如何通过遵循这些规则来更改您的示例:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
people = ['Nicholas Gyeney', 'André']
writers = ", ".join(people)
print(writers)
print("Writers: {}".format(writers))
print(type(writers))
print(len(writers))
其输出:
<type 'str'>
23
以下是发生的变化:
- 文件顶部指定的文件编码
- 已更换
\xe9
与实际的 Unicode 字符 (é
)
- Removed
u
前缀
它在 Python 2.7.12 和 3.5.2 中运行得很好。
但请注意,删除u
前缀将使 python 使用常规str
键入而不是unicode
(参见输出print(type(writers))
)。的情况下utf-8
它在大多数地方都像 unicode 字符串一样工作,但是在检查文本长度时将返回错误的值。在这个例子中len
回报23
,其中实际字符数是22
。这是因为底层类型是str
,它将每个字节计为一个字符,但是字符é
实际上应该是两个字节。
换句话说,这在输出数据正常时有效(如您的示例中所示),但如果您想对文本进行字符串操作则无效。在这种情况下,您仍然需要使用u
在字符串操作之前,将数据显式添加前缀或转换为 unicode 类型。
所以,如果不是你的简单例子,最好还是使用u
字首。您在两个地方需要它:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
people = [u'Nicholas Gyeney', u'André']
writers = ", ".join(people)
print(writers)
print(u"Writers: {}".format(writers))
print(type(writers))
print(len(writers))
其输出:
<type 'unicode'>
22
Note: u
前缀在 Python 3.0 中被删除,然后在 Python 3.3 中再次重新引入以实现向后兼容性。
有关在 Python 2 中使用 unicode 文本的所有复杂性的详细说明,请参阅官方文档:Python 2 - Unicode 指南 https://docs.python.org/2/howto/unicode.html.
以下是指定文件编码的特殊注释的摘录:
Python 支持以任何编码方式编写 Unicode 文字,但是您有
声明正在使用的编码。这是通过包含一个来完成的
特殊注释作为源文件的第一行或第二行:
#!/usr/bin/env python
# -*- coding: latin-1 -*-
u = u'abcdé' print ord(u[-1])
该语法的灵感来自于 Emacs 指定变量的表示法
本地到文件。 Emacs 支持许多不同的变量,但是 Python
只支持coding
. The -*-
符号向 Emacs 表明
评论很特别;它们对于 Python 来说没有任何意义,但是
习俗。 Python 寻找coding: name
or coding=name
在里面
评论。
如果您不包含这样的注释,则使用的默认编码将是
ASCII。
如果你拿到这本书”学习Python,第五版 http://shop.oreilly.com/product/0636920028154.do”,我鼓励您阅读第八部分高级主题中的第 37 章“Unicode 和字节字符串”。它包含在两代 Python 中使用 Unicode 文本的详细说明。
另一个值得一提的细节是format
总是返回一个ascii
string 如果格式字符串是ascii
,无论参数是在unicode
.
与此相反,旧式格式%
返回一个unicode
如果任何参数是字符串unicode
。所以不要写这个
print(u"Writers: {}".format(writers))
你可以这样写,它不仅更短、更漂亮,而且在 Python 2 和 3 中都可以工作:
print("Writers: %s" % writers)