Linux 上的 UnicodeEncodeError 但在 Windows 上没有

Hel*_*123 2 python linux unicode python-2.7

UnicodeEncodeError: 'ascii' codec can't encode当我尝试在 Linux 上打印 Unicode 字符串时出现异常。在 Windows 上,我没有收到错误消息。

在Linux上执行的代码:

    my_str = u'\u4ece\u5165\u5e93'
    print "%r"  % my_str #output: u'\u4ece\u5165\u5e93' 
    print "%s" % my_str #output: UnicodeEncodeError: 'ascii' codec can't encode character u'\u4ece' in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)

在 Windows 上,我得到:

    my_str = u'\u4ece\u5165\u5e93'
    print "%r"  % my_str #output: u'\u4ece\u5165\u5e93' 
    print "%s" % my_str #output: ???
Run Code Online (Sandbox Code Playgroud)

Ala*_*ack 6

locale和/或环境很可能已损坏、未安装、未设置或设置为C. Python 使用区域设置在标准输出上应用正确的编码器。这允许将 Unicode 编码为适当的编码。

如果您从命令行运行 Python,请确保您的语言环境正常。键入locale,您应该会看到如下内容:

 $ locale
LANG=en_GB.UTF-8
LANGUAGE=
LC_CTYPE="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_MESSAGES="en_GB.UTF-8"
LC_PAPER="en_GB.UTF-8"
LC_NAME="en_GB.UTF-8"
LC_ADDRESS="en_GB.UTF-8"
LC_TELEPHONE="en_GB.UTF-8"
LC_MEASUREMENT="en_GB.UTF-8"
LC_IDENTIFICATION="en_GB.UTF-8"
LC_ALL=
 $
Run Code Online (Sandbox Code Playgroud)

如果您看到错误消息或 LANG=C 或类似信息,Python 将使用 ASCII 编码器,它拒绝非 ASCII 字符。

要查找系统上安装的语言环境,请键入locale -a。选择适当的语言环境,最好是以“UTF-8”结尾的语言环境,并进行相应的设置LANG。例如

LANG=en_GB.UTF-8
Run Code Online (Sandbox Code Playgroud)

locale再次运行并检查错误。如果您仍然遇到错误,那么您将需要研究如何为您的发行版重建您的语言环境。

如果您在 IDE 中运行或无法修复,那么将以下环境变量添加到 shell 或 IDE 运行配置可能会成功:

export PYTHONIOENCODING=utf-8
Run Code Online (Sandbox Code Playgroud)

这告诉 Python 忽略语言环境并将 UTF-8 编码器应用于标准输出。

您可以通过使用localePython 中的模块来验证 Python 用于语言环境的内容。我的健康语言环境返回:

>>> import locale
>>> locale.getdefaultlocale()
('en_GB', 'UTF-8')
>>> locale.getpreferredencoding()
'UTF-8'
Run Code Online (Sandbox Code Playgroud)

不健康的语言环境将返回US-ASCIIlocale.getpreferredencoding()