unicode_literals的用途是什么?

56 投票
2 回答
28996 浏览
提问于 2025-04-18 04:47

我在使用Python的__future__.unicode_literals时遇到了一个奇怪的问题。没有导入unicode_literals的时候,输出是正确的:

# encoding: utf-8
# from __future__ import unicode_literals
name = 'helló wörld from example'
print name

但是当我添加了unicode_literals的导入后:

# encoding: utf-8
from __future__ import unicode_literals
name = 'helló wörld from example'
print name

我就出现了这个错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xf3' in position 4: ordinal not in range(128)

请问unicode_literals是把每个字符串都编码成utf-8吗?我该怎么解决这个错误呢?


另外,您可以查看这个链接:Python、Unicode和Windows控制台,里面有一个相关的、特定于Windows的问题。

2 个回答

3

简单来说,到2023年(以及以后)

你的代码很可能支持Python 3及以上,对吧?

所以你可以去掉这个语句。

__future__.unicode_literals 是为了让Python 2和3之间能够兼容使用而设计的(可以看看文档)。

因为Python 2已经不再支持,所以保留这个兼容性代码的理由不多了。(当然,如果你在乎长期支持的用户,那另当别论)

64

你的终端或控制台没有正确告诉Python它支持UTF-8编码。

如果没有那行from __future__ import unicode_literals,你创建的就是一个字节字符串,它包含的是UTF-8编码的字节。而如果有这行代码,你创建的就是一个unicode字符串。

print在处理这两种字符串时是有区别的;字节字符串会直接写入sys.stdout,而不会改变。而unicode字符串在打印之前需要先转换成字节,这个转换是根据sys.stdout.encoding来决定的。如果你的系统没有正确告诉Python它支持什么编码,默认情况下就会使用ASCII编码。

你的系统没有告诉Python该用什么编码,所以sys.stdout.encoding被设置为ASCII,这导致打印unicode值时失败了。

你可以通过手动将字符串编码为UTF-8来验证这个问题:

# encoding: utf-8
from __future__ import unicode_literals
name = 'helló wörld from example'
print name.encode('utf8')

你也可以通过创建没有from __future__这行的unicode字面量来重现这个问题:

# encoding: utf-8
name = u'helló wörld from example'
print name

这里的u'..'也是一个unicode字面量。

由于没有关于你使用的环境的具体信息,很难说出解决方案是什么;这很大程度上取决于你使用的操作系统和终端或控制台。

撰写回答