在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?我应该做些什么来覆盖这个错误?
2条答案
按热度按时间cidc1ykv1#
您的终端或控制台无法让Python知道它支持UTF-8。
如果没有
from __future__ import unicode_literals
行,您将构建一个包含UTF-8编码字节的字节字符串,而使用该字符串,您将构建一个unicode
字符串。print
必须不同地处理这两个值;一个字节字符串被写入sys.stdout
,unicode
字符串首先被编码为字节,Python会查询sys.stdout.encoding
,如果你的系统没有正确地告诉Python它支持什么编解码器,那么默认的是使用ASCII。您的系统未能告诉Python使用哪种编解码器;
sys.stdout.encoding
已设置为ASCII,编码要打印的unicode
值失败。您可以通过在打印时手动编码为UTF-8来验证这一点:
而且,您也可以通过创建不使用
from __future__
import语句的unicode常量来重现这个问题:其中
u'..'
也是一个unicode文字。如果不详细说明您的环境是什么,就很难说解决方案是什么;这在很大程度上取决于所使用的操作系统和控制台或终端。
aemubtdh2#
截至2023年(及以后)的简短答复
您的代码很可能支持Python〉= 3,对吗?
所以你可以放弃这个声明了。
__future__.unicode_literals
旨在与Python 2 3向后/向前兼容<->(请阅读doc)。从Python 2 isn't supported upstream开始,几乎没有理由保留这种向前兼容的代码(当然,除非你关心长期支持发行版的用户)。