为什么Python 3.2中的print()似乎默认为UTF-8?

Jon*_*mbs 2 printing string unicode encode python-3.x

我正在编写脚本来清理unicode文本文件(存储为UTF-8),我选择使用Python 3.x(3.2)而不是更受欢迎的2.x,因为3.x应该默认为UTF- 8.也许我做错了什么,但似乎打印声明至少仍然没有默认为UTF-8.如果我尝试打印一个包含特殊字符的字符串(下面的msg是一个字符串),我仍然会得到一个像这样的UnicodeEncodeError:

print(label, msg)
... in encode
    return codecs.charmap_encode(input,self.errors,encoding_map)[0] 
UnicodeEncodeError: 'charmap' codec can't encode character '\u0968' in position
38: character maps to <undefined>
Run Code Online (Sandbox Code Playgroud)

如果我首先使用encode()方法(它很好地默认为UTF-8),我可以避免错误:

print(label, msg.encode())
Run Code Online (Sandbox Code Playgroud)

这也适用于打印包含unicode字符串的对象或列表 - 这是我在调试时经常需要做的事情 - 因为str()似乎默认为UTF-8.但是我真的需要记住每次我想要打印(myobj)时使用print(str(myobj).encode())吗?如果是这样,我想我可以尝试用自己的函数包装它,但我对处理print()支持的所有参数排列没有信心.

此外,我的脚本从文件加载正则表达式并逐个应用它们.在应用encode()之前,我能够在控制台上打印一些相当清晰的东西:

msg = 'Applying regex {} of {}: {}'.format(i, len(regexes), regex._findstr)
print(msg)

Applying regex 5 of 15: ^\\ge[0-9]*\b([ ]+[0-9]+\.)?[ ]*
Run Code Online (Sandbox Code Playgroud)

但是,如果正则表达式包含文字unicode字符,则会崩溃,因此我首先将encode()应用于字符串.但是现在这些正则表达式很难在屏幕上阅读(我怀疑如果我尝试编写将这些正则表达式保存回磁盘的代码,我可能会遇到类似的问题):

msg = 'Applying regex {} of {}: {}'.format(i, len(regexes), regex._findstr)
print(msg.encode())

b'Applying regex 5 of 15: ^\\\\ge[0-9]*\\b([ ]+[0-9]+\\.)?[ ]*'
Run Code Online (Sandbox Code Playgroud)

我在Python中还不是很有经验,所以我可能会误解.任何解释或指向教程的链接(对于Python 3.x;我在网上看到的大部分内容都是2.x)将非常感激.

geo*_*org 6

print不默认任何编码,它只使用输出设备(如控制台)声称支持的任何编码.您的控制台编码似乎是非unicode,因此print尝试使用该编码对您的unicode字符串进行编码,然后失败.解决这个问题的最简单方法是告诉控制台使用utf8(就像export LC_ALL=en_US.UTF-8在unix系统上一样).