【问题标题】:Force UTF-8 output using python使用 python 强制 UTF-8 输出
【发布时间】:2016-03-11 21:34:50
【问题描述】:

我有以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character '\xd7' in position 31: ordinal not in range(128)

从此代码:

test_string = """
Antelope Canyon, Arizona [1600×1068] </a>&#32; <span class="domain">(<a
"""

print(test_string)

sys.getdefaultencoding 的输出:

In [6]: sys.getdefaultencoding()
Out[10]: 'utf-8'

我正在使用带有油炸面包块的 Chromebook - 如果这会有所不同(我觉得它可能会)。

我不确定是否有某种方式可以“强制”输出这样的字符串,或者只是忽略任何有问题的字符。

终端或控制台 o 重定向无法处理 UTF-8;你想在什么环境下打印。

我正在尝试在 Spacemacs 中使用 iPython 运行它

In [22]: sys.stdout.encoding
Out[27]: 'ANSI_X3.4-1968'

在shell中,命令locale输出什么?

在我正在运行的 shell(Spacemacs 中的 iPython)中,该命令未定义,在使用 ctrl alt t 启动的默认 shell 上,输出为

$ locale
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=

【问题讨论】:

  • 啊,× 是 U+00D7 字符。
  • 这里重要的是sys.stdout.encoding,它是从父进程(通常是shell)设置的。
  • 在shell中,命令locale输出什么?
  • @KevinGuan:完全正确。但是 OP 使用的是 Chromebook..
  • 如果您使用的是 Emacs 环境,请使用 (setenv "LC_CTYPE" "UTF-8") 设置语言环境。

标签: python python-3.x utf-8 ascii non-ascii-characters


【解决方案1】:

在 POSIX 主机上,Python 从 locale 确定输出编码,这是一组环境变量,用于传达如何为各种语言设置配置环境。请参阅locale.getdefaultlocale() function,或更具体地说,请参阅locale.getpreferredencoding() 函数。

该函数的输出用于设置sys.stdout.encoding,然后用于对打印的任何 Unicode 文本进行编码。

您的语言环境设置为POSIX,这意味着默认编码是 ASCII。您需要将该语言环境配置为使用支持所有 Unicode 的编码。我不知道如何为 Chromebook 执行此操作。在我的 Mac 上,语言环境大部分设置为 en_US.UTF-8,因此我的终端支持所有 Unicode 标准。您可以通过设置export LC_CTYPE=en_US.UTF-8 来强制解决此问题。

您可以通过设置 PYTHONIOENCODING environment variable 来覆盖 Python 的选择。

请注意,在最近的 Python 3 版本中,sys.stdout 和 sys.stderr 使用 backslashescape error handler,它将您的控制台无法处理的任何字符替换为标准的 \xhh、\uhhhh 和 \Uhhhhhhhh 转义序列;所以你不会看到异常:

Antelope Canyon, Arizona [1600\xd71068] </a>&#32; <span class="domain">(<a 

【讨论】:

  • 我应该可以从这里开始工作,谢谢
【解决方案2】:

啊,找了又找,找到了this。正如它所说,也许你可以尝试:

  1. 编辑(先创建)/etc/locale.gen 文件。
  2. 在里面写下以下文字:

    en_GB.UTF-8 UTF-8
    LC_ALL="en_GB.UTF-8"
    
  3. 也许尝试重新启动 Chromebook。

然后检查locale 命令的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 2016-12-14
    • 2011-11-17
    • 1970-01-01
    • 2011-08-19
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多