表面上看很简单的问题:如何在Python3中使用
有没有一种干净便携的方法来解决这个问题?
稍微扩展一下:这里的问题是Python3字符串包含Unicode编码字符,而终端可以具有任何编码。如果你很幸运,你的终端可以处理字符串中包含的所有字符,一切都会很好,如果你的终端无法处理(例如,有人设置了
如果你在Python3中手动编码一个字符串,你可以提供一个错误处理程序来忽略或替换不能编码的字符:
对于
这个问题的一个真实例子是: Python3: UnicodeEncodeError only when run from crontab
print()
打印字符串?应该很简单:print(my_string)
但那样做是不行的。根据my_string
的内容、使用的操作系统和环境变量,这会抛出一个UnicodeEncodeError
异常:
>>> print("\u3423")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character '\u3423' in position 0: ordinal not in range(128)
有没有一种干净便携的方法来解决这个问题?
稍微扩展一下:这里的问题是Python3字符串包含Unicode编码字符,而终端可以具有任何编码。如果你很幸运,你的终端可以处理字符串中包含的所有字符,一切都会很好,如果你的终端无法处理(例如,有人设置了
LANG=C
),那么你会得到一个异常。如果你在Python3中手动编码一个字符串,你可以提供一个错误处理程序来忽略或替换不能编码的字符:
"\u3423".encode("ascii", errors="replace")
对于
print()
,我没有看到一种简单的方法来插入错误处理程序,即使有,一个普通的错误处理程序似乎是一个可怕的想法,因为它会修改数据。一个条件错误处理程序可能有效(即检查isatty()
并根据此决定要做什么),但这似乎是一种非常不专业的方法,只是为了打印一个字符串,而且我甚至不确定在某些情况下它是否会失败。这个问题的一个真实例子是: Python3: UnicodeEncodeError only when run from crontab
sys.stdout = io.TextIOWrapper(sys.stdout.detach(), errors='backslashreplace')
。 - Eryk SunLANG=C python3 -c 'print("\u3423")'
,我可以重现你的错误,而使用LANG=en_US.UTF-8
就能正常工作。 - John1024