什么是unicode_literals用于?

ssj*_*ssj 37 python unicode encoding utf-8

__future__.unicode_literals在Python中遇到了一个奇怪的问题.没有导入unicode_literals我得到正确的输出:

# encoding: utf-8
# from __future__ import unicode_literals
name = 'helló wörld from example'
print name
Run Code Online (Sandbox Code Playgroud)

但是当我添加unicode_literals导入时:

# encoding: utf-8
from __future__ import unicode_literals
name = 'helló wörld from example'
print name
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

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

是否将unicode_literals每个字符串编码为utf-8?我该怎么做才能覆盖这个错误?

Mar*_*ers 51

您的终端或控制台无法让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来验证这一点:

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

并且你可以通过创建unicode文字而不使用from __future__import语句来重现这个问题:

# encoding: utf-8
name = u'helló wörld from example'
print name
Run Code Online (Sandbox Code Playgroud)

在哪里u'..'也是unicode文字.

如果没有关于您的环境的详细信息,很难说解决方案是什么; 这在很大程度上取决于所使用的操作系统和控制台或终端.