我写了一个小脚本,基本上在windows终端打印一些信息(使用希腊语cp737代码页)。它本质上是这样的:
while True:
title = u'greek and other unichars follow:\t{}'.format(unicode_input())
print title.encode('cp737','ignore')
输出:
greek and other unichars follow: Καλημέρα!
按预期工作,终端打印大部分希腊字母,忽略了罕见的例外情况,这些例外情况无法转化为更受限制的cp737。
现在在python3中打印字节时,比如u" unitext" .encode(),输出到stdout字节对象' as-is':
b"greek and other unichars follow:\t\x89\x98\xa2\x9e\xa3\xe2\xa8\x98!"
在终端中直接打印unicode最终会导致a UnicodeEncode错误。
转换unicode - > bytes(cp737,ignore) - > unicode,似乎古怪。
这样做的优雅方式是什么?
答案 0 :(得分:2)
对于Python 3,您可以选择几个选项:
PYTHONIOENCODING
环境变量设置为终端的编码。例如,您可以将其设置为PYTHONIOENCODING=cp737:ignore
。然后,如果您使用print
打印Unicode文本,它将自动转换为cp737
字符集并正确输出。sys.stdout
的编码。请参阅此问题:How to set sys.stdout encoding in Python 3? sys.stdout.buffer
,绕过sys.stdout
使用的编码机制。