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

时间:2017-08-24 10:14:53

标签: python-3.x unicode character-encoding

考虑以下终端命令行

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)字符串?

一些注释

到目前为止我尝试了什么

  1. 我尝试使用sys.stdout.write代替print,但仍然可能出现编码问题。

  2. 我尝试通过

    对字符串进行编码
    bytes=line.encode('utf-8')
    

    这永远不会引发打印异常,但即使在有能力的终端中,非ascii字符也会被其代码点号替换。

  3. 我尝试将decode方法与'ignore'参数一起使用:

    bytes=line.encode('utf-8')
    decoded=bytes.decode('utf-8', 'ignore')
    print(decoded)
    

    但问题不在于字符串中的解码,而是打印函数中的

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

    • 在macOS上的Emacs中使用bash shell。

    • 通过do shell script在Applescript中接收“打印”字符串,例如:

      set txt to do shell script "/usr/local/bin/python3 -c \"print('hören')\" "
      

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

1 个答案:

答案 0 :(得分:1)

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

对于支持UTF-8的终端,您可以执行以下操作:

export PYTHONIOENCODING='utf-8'

要在ASCII终端中打印'?',您可以执行以下操作:

export PYTHONIOENCODING='ascii:replace'

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

export PYTHONIOENCODING=':replace'