python unicode_literals的用途是什么?

aiazj4mn  于 2023-01-16  发布在  Python
关注(0)|答案(2)|浏览(109)

在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?我应该做些什么来覆盖这个错误?

cidc1ykv

cidc1ykv1#

您的终端或控制台无法让Python知道它支持UTF-8。
如果没有from __future__ import unicode_literals行,您将构建一个包含UTF-8编码字节的字节字符串,而使用该字符串,您将构建一个unicode字符串。
print必须不同地处理这两个值;一个字节字符串被写入sys.stdoutunicode字符串首先被编码为字节,Python会查询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__ import语句的unicode常量来重现这个问题:

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

其中u'..'也是一个unicode文字。
如果不详细说明您的环境是什么,就很难说解决方案是什么;这在很大程度上取决于所使用的操作系统和控制台或终端。

aemubtdh

aemubtdh2#

截至2023年(及以后)的简短答复
您的代码很可能支持Python〉= 3,对吗?
所以你可以放弃这个声明了。
__future__.unicode_literals旨在与Python 2 3向后/向前兼容<->(请阅读doc)。
从Python 2 isn't supported upstream开始,几乎没有理由保留这种向前兼容的代码(当然,除非你关心长期支持发行版的用户)。

相关问题