Python 3 UnicodeEncodeError:' ascii'编解码器无法对字符

时间:2016-12-31 13:39:23

标签: unicode encoding utf-8 locale python-3.5

我刚刚开始学习Python,但我已经遇到了麻烦 我有一个只有一个命令的简单脚本:

#!/usr/bin/env python3
print("Příliš žluťoučký kůň úpěl ďábelské ódy.") # Text in Czech 

当我尝试运行此脚本时:

python3 hello.py 

我收到此消息:

Traceback (most recent call last):
  File "hello.py", line 2, in <module>
    print("P\u0159\xedli\u0161 \u017elu\u0165ou\u010dk\xfd k\u016fn \xfap\u011bl \u010f\xe1belsk\xe9 \xf3dy.")
UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-2: ordinal not in range(128)

我正在使用Kubuntu 16.04和Python 3.5.2。 当我尝试这个时:export PYTHONIOENCODING=utf-8它起作用但只是暂时的。下次我打开bash时遇到了同样的错误。

根据https://docs.python.org/3/howto/unicode.html#the-string-type Python源代码的默认编码是UTF-8。
所以我将源文件保存为UTF-8,Konsole设置为UTF-8但我仍然收到错误!
即使我添加

# -*- coding: utf-8 -*-
一开始它什么也没做。

另一个奇怪的事情:当我只使用python而不是python3运行时,它可以工作。如何在Python 2.7.12中工作而不是在3.5.2中工作?

永久解决这个问题的想法?谢谢。

1 个答案:

答案 0 :(得分:9)

感谢 Mark Tolen Alastair McCormack 建议可能出现的问题。问题出在区域设置中 当我运行locale时,输出为:

LANG=C
LANGUAGE=
LC_CTYPE="C"
LC_NUMERIC=cs_CZ.UTF-8
LC_TIME=cs_CZ.UTF-8
LC_COLLATE=cs_CZ.UTF-8
LC_MONETARY=cs_CZ.UTF-8
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT=cs_CZ.UTF-8
LC_IDENTIFICATION="C"
LC_ALL=

此“C”是使用ANSI charmap的默认设置。这就是问题所在。正在运行locale charmap给了我:ANSI_X3.4-1968,它无法显示非英文字符 我使用此Ubuntu documentation site修复此问题。

我将这些行添加到/etc/default/locale

LANGUAGE=cs_CZ.UTF-8
LC_ALL=cs_CZ.UTF-8

然后您必须重新启动会话(注销并退出)才能应用这些设置。

现在运行locale会返回此输出:

LANG=C
LANGUAGE=cs
LC_CTYPE="cs_CZ.UTF-8"
LC_NUMERIC="cs_CZ.UTF-8"
LC_TIME="cs_CZ.UTF-8"
LC_COLLATE="cs_CZ.UTF-8"
LC_MONETARY="cs_CZ.UTF-8"
LC_MESSAGES="cs_CZ.UTF-8"
LC_PAPER="cs_CZ.UTF-8"
LC_NAME="cs_CZ.UTF-8"
LC_ADDRESS="cs_CZ.UTF-8"
LC_TELEPHONE="cs_CZ.UTF-8"
LC_MEASUREMENT="cs_CZ.UTF-8"
LC_IDENTIFICATION="cs_CZ.UTF-8"
LC_ALL=cs_CZ.UTF-8

并且正在运行locale charmap返回:

UTF-8
相关问题