进入问题之前,我想通知我看到很多关于此问题的StackOverflow问题和python bug,但我无法找到引起该问题的根本原因
我在centos计算机中收到UnicodeEncodingError。 Python不是内置在计算机中的,而是具有所需python版本(3.6.7)的虚拟环境已在其他位置构建并复制到此处。因此,在启动服务器时,我们将激活虚拟环境并启动服务器。
在两种情况下都观察到该问题
错误如下所示
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,但由于环境是生产环境,因此我不确定在不知道副作用的情况下进行修改。
编辑-我尝试通过打开python终端并通过打印来打印相同的字符集,这些字符通过控制台破坏了上述尝试的代码,没有任何问题
我想知道如何解决这个问题?
谢谢
�������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会容易得多日志记录(这样做的好处是可以向您显示不可见和空格字符...但是如果它是客户端应用程序的一部分,则效果不佳)