unicode - Python 3 UnicodeEncodeError : 'ascii' codec can't encode characters

标签 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 中工作?

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

最佳答案

感谢 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 字符映射的默认设置。这就是问题所在。运行 locale charmap给了我:ANSI_X3.4-1968不能显示非英文字符。
我用这个修复了这个 Ubuntu documentation site .

我将这些行添加到 /etc/default/locale :
LANGUAGE=cs_CZ.UTF-8
LC_ALL=cs_CZ.UTF-8

然后您必须重新启动 session (注销并登录)以应用这些设置。

运行 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

关于unicode - Python 3 UnicodeEncodeError : 'ascii' codec can't encode characters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41408791/

相关文章:

swift `String.Encoding` : `.unicode` vs `.utf16`

encoding - 变压器模型中位置编码的实现细节?

Java将文件写为纯 "windows-1252"

html - 浏览器中未正确显示马拉地语

java - Json将String中的&转换为\u0026

OLE CSV 导入中的 Unicode 字符

c - url在c中编码一个utf-8字符串?

git checkout -p 指定编码

php 希腊字符编码

c - 在C中获取UTF-8的字符串长度?