centos 7计算机中的python 3.6.7 UnicodeEncodingError

问题描述 投票:0回答:1

进入问题之前,我想通知我看到很多关于此问题的StackOverflow问题和python bug,但我无法找到引起该问题的根本原因

我在centos计算机中收到UnicodeEncodingError。 Python不是内置在计算机中的,而是具有所需python版本(3.6.7)的虚拟环境已在其他位置构建并复制到此处。因此,在启动服务器时,我们将激活虚拟环境并启动服务器。

在两种情况下都观察到该问题

  1. 记录输入请求参数,其中包含Unicode字符
  2. 我们将打印语句通过管道传输到日志文件,并且尝试通过代码打印此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终端验证了以下内容

  • sys.getdefaultencoding()
  • sys.getfilesystemencoding()
  • sys.stdout.encoding
  • LANG设置为en.us-utf-8
  • 未设置LC_ALL

所有人都拥有utf-8

我经历了一些解决方案,要求修改LC_ALL或在环境变量中添加PYTHONIOENCODING,但由于环境是生产环境,因此我不确定在不知道副作用的情况下进行修改。

编辑-我尝试通过打开python终端并通过打印来打印相同的字符集,这些字符通过控制台破坏了上述尝试的代码,没有任何问题

我想知道如何解决这个问题?

谢谢

python python-3.x linux centos7 python-unicode
1个回答
0
投票
大多数ascii终端无法呈现unicode字符(您可以尝试更改字体...也许可以用...),因此即使您遇到编码错误,打印可能看起来像�������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会容易得多日志记录(这样做的好处是可以向您显示不可见和空格字符...但是如果它是客户端应用程序的一部分,则效果不佳)
© www.soinside.com 2019 - 2024. All rights reserved.