进入问题之前,我想通知我看到很多关于此问题的StackOverflow问题和python bug,但我无法找到引起该问题的根本原因
我正在使用centos机器获取UnicodeEncodingError
。 Python不是内置在计算机中的,而是具有所需python版本(3.6.7)的虚拟环境已在其他位置构建并复制到此处。因此,在启动服务器时,我们将激活虚拟环境并启动服务器。
但是在控制台中记录或打印任何Unicode字符时,我遇到Unicode编码错误,类似这样
print("\u6211\u7684\u7535\u8111\u603b\u662f\u51fa\u73b0Windows\u9700\u8981\u6fc0\u6d3b")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 56-63: ordinal not in range(128)
我通过python终端验证了以下内容
所有人都有utf-8
。
[我经历了一些解决方案,要求修改环境变量中的LC_ALL
或添加PYTHONIOENCODING
,但由于环境是生产环境,因此我不确定在不知道副作用的情况下进行修改。
我想知道如何解决这个问题?
�������Windows�������
如果您在空闲状态下运行它,则可以... ...>
我会
强烈
建议只使用print(repr(string_that_might_have_unicode))
,因为那样可以保证可打印的ascii表示形式...而且没有比崩溃应用程序更糟糕的了,因为您正尝试打印一些调试信息...(打印repr
会更像b"'\\u6211\\u7684\\u7535\\u8111\\u603b\\u662f\\u51fa\\u73b0Windows\\u9700\\u8981\\u6fc0\\
u6d3b'"
您也可以尝试在打印前手动将其设置为encode
print(my_unicode_string.encode("utf8"))
那个
might
可以在某些终端上工作...但是实际上...只要打印repr,除非您向用户显示该代理(但是由于您谈论服务器,所以我认为这不是终端客户端应用程序,但是调试正在打印的信息(并重定向到日志文件?))如果您确实需要将确切的unicode打印到终端而不是repr,那么我认为您需要执行手动解码步骤,以将utf8发送到实际的终端...但是,在需要时总是打印repr会容易得多日志记录(这样做的好处是可以向您显示不可见和空格字符...但是如果它是客户端应用程序的一部分,则效果不佳)