python3中的UnicodeEncodeError

时间:2016-10-18 16:29:39

标签: python python-3.x unicode utf-8 locale

我的一些应用程序库依赖于能够将UTF-8字符打印到stdout和stderr。因此,这绝不能失败:

print('\u2122')

在我的本地计算机上它可以工作,但在我的远程服务器上它会引发UnicodeEncodeError: 'ascii' codec can't encode character '\u2122' in position 0: ordinal not in range(128)

我尝试$ PYTHONIOENCODING=utf8没有明显效果。

sys.stdout = codecs.getwriter("utf-8")(sys.stdout.detach())

工作一段时间,然后失速并最终以ValueError: underlying buffer has been detached

失败

sys.getdefaultencoding()返回'utf-8'sys.stdout.encoding返回'ANSI_X3.4-1968'

我该怎么办?我不想编辑第三方库。

2 个答案:

答案 0 :(得分:3)

来自@ ShadowRanger对我的问题的评论,

  

PYTHONIOENCODING=utf8除非您export(或使用它启动Python前缀),否则不会工作。否则,它是bash中的一个局部变量,它不会在子进程的环境中继承。 export PYTHONIOENCODING=utf-8会在bash中设置并导出它。

export PYTHONIOENCODING=utf-8完成了这个技巧,UTF-8字符不再引发UnicodeEncodeError

答案 1 :(得分:0)

我猜你是在类UNIX系统上,并且你的环境将LANG(或LC_ALL或其他)设置为C

尝试编辑默认shell的启动文件,将LANG设置为en_US.utf-8(或者对您有意义的任何区域设置)?例如,在bash中,修改~/.bash_profile(或~/.profile如果您正在使用sh兼容性),请添加:

export LANG="en_US.utf-8"

对于(t)csh,请修改~/.cshrc(或~/.tcshrc如果您正在使用的内容)添加:

setenv LANG "en_US.utf-8"

进行更改" live"不起作用,因为您的shell可能托管在一个终端中,该终端仅为ASCII显示配置,基于启动时生效的LANG=C(许多终端会进行会话合并,所以即使您更改了LANG然后启动了一个新终端,它将与共享终端进程合并,并使用过时的LANG)。因此,在您更改~/.bash_profile之后,请注销然后重新登录,以便您的root shell将为每个其他进程正确设置LANG(因为它们最终都来自root shell {。}}。 / p>