我的一些应用程序库依赖于能够将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'
我该怎么办?我不想编辑第三方库。
答案 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>