如何在忽略不可编码字符的同时输出Python3(unicode)字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在忽略不可编码字符的同时输出Python3(unicode)字符串相关的知识,希望对你有一定的参考价值。

请考虑以下终端命令行

python3 -c 'print("hören")'

在大多数终端中,这会打印“hören”(德语为“听到”),在某些终端中会出现错误

UnicodeEncodeError: 'ascii' codec can't encode character 'xf6' 
in position 1: ordinal not in range(128)

在我的Python3程序中,我不希望只是打印出来的东西会引发这样的异常,而是我宁愿输出不会引发异常的字符。

所以我的问题是:如何在忽略不可编码字符的同时输出Python3(unicode)字符串?


Some notes

到目前为止我尝试过的

  1. 我尝试使用sys.stdout.write而不是print,但编码问题仍然可能发生。
  2. 我尝试在byes中编码字符串 bytes=line.encode('utf-8') 这永远不会引发打印异常,但即使在有能力的终端中,非ascii字符也会被其代码点号替换。
  3. 我尝试使用decode方法和'ignore'参数: bytes=line.encode('utf-8') decoded=bytes.decode('utf-8', 'ignore') print(decoded) 但问题不在于字符串中的解码,而是打印功能中的插入。

这里有些终端似乎不具备所有字符

  • 在macOS上的Emacs里面的bash shell。
  • 通过do shell script在Applescript中接收“打印”字符串,例如: set txt to do shell script "/usr/local/bin/python3 -c "print('hören')" "

更新:这些终端都从locale.getpreferredencoding()the值US-ASCII返回。

答案

我首选的方法是根据您使用的终端设置PYTHONIOENCODING变量。

对于支持UTF-8的终端,您可以:

export PYTHONIOENCODING='utf-8'

要在ASCII终端中打印'?',您可以:

export PYTHONIOENCODING='ascii:replace'

或者甚至更好,如果你不关心编码,你应该能够做到:

export PYTHONIOENCODING=':replace'

以上是关于如何在忽略不可编码字符的同时输出Python3(unicode)字符串的主要内容,如果未能解决你的问题,请参考以下文章

Python3 字符串前面加u,r,b的含义

Python3 字符串前加“u,r,b”的意义

Python3字符解码与编码

java 如何 输入一个字符的编码 然后输出编码对应的字符

如何在 PowerShell 字符串文字中编码 Unicode 字符代码?

Python2和Python3中的字符串编码问题解决