unicode_literals的用途是什么?
我在使用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 个回答
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字面量。
由于没有关于你使用的环境的具体信息,很难说出解决方案是什么;这很大程度上取决于你使用的操作系统和终端或控制台。