在 linux 上打印重音时出现异常

exception when printing accents on linux

我写了一个非常基本的 python3.5 脚本,它在控制台中显示一条带有打印功能的消息。

此脚本在我的个人计算机上运行良好。

我已上传到 linux 计算机,但出现此异常:

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

我不明白为什么它能在我的电脑上运行,而在目标电脑上却不能运行。

谢谢

* 编辑 *

这是我的代码:

print('hello world é è")

在文件顶部添加 # -*- coding: utf-8 -*-

试试这个


a="hello world é è".encode("iso-8859-15")
print(a.decode("iso-8859-15"))

您的 Linux 环境中的语言环境仅支持 ASCII。因此,在尝试打印 non-ASCII 个字符时会出现错误。

最好的解决方法 是将 PYTHONIOENCODING variable to UTF-8, or set the PYTHONUTF8 环境变量设置为“1”。例如

$ PYTHONIOENCODING=UTF-8 python myprogram.py

最好的解决方案 是设置支持 UTF-8 的语言环境。这可以通过操作系统的区域设置菜单或通过更改相关配置文件(文件可能因发行版而异)来完成。 UTF-8 是 ASCII 的超集,因此更改不会导致任何问题(但无论如何都要备份关键数据)。

也可以在打印前从字符串中去除 non-ASCII 个字符,但这种方法会丢失信息。 Non-ASCII 个字符可以通过忽略 encoding 个错误完全删除:

>>> s = 'hello world é è'
>>> print(s.encode('ascii', errors='ignore').decode())
hello world  

unicodedata.normalize函数可用于尝试获取等效的ASCII字符,如果unicode字符可以分解为ASCII字符和重音符号。

>>> print(ud.normalize('NFD', s).encode('ascii', errors='ignore').decode())
hello world e e