【发布时间】:2017-02-28 00:54:54
【问题描述】:
我的一些应用程序库依赖于能够将 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'
我能做什么?我不想编辑第三方库。
【问题讨论】:
-
我认为this link 会帮助你。
-
旁注:即使其他一切正常,
PYTHONIOENCODING=utf8也不会工作,除非你export它(或在 Python 启动前加上它)。否则,它是bash中的局部变量,不会在子进程的环境中继承。export PYTHONIOENCODING=utf-8将在bash中设置和导出它。 -
@SamuelPS:最佳答案的建议是......次优。 Forcibly reloading
systo regain access tosetdefaultencodingcan cause problems,无论如何,现代 Python (>=3.3) 上的正确解决方案是确保您的系统使用广泛有用的完整 Unicode,支持全局默认编码。其他任何事情都意味着您正在使用 hack 来输出操作系统官方甚至无法识别的字符,并且依赖于它继续播放,尽管它声称它不会工作。
标签: python python-3.x unicode utf-8 locale