我正在编写脚本来清理 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>
如果我首先使用 encode() 方法(很好地默认为 UTF-8),我可以避免错误:
print(label, msg.encode())
这也适用于打印包含 unicode 字符串的对象或列表——这是我在调试时经常要做的事情——因为 str() 似乎默认为 UTF-8。但是我真的需要记住每次我想做 print(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]+\.)?[ ]*
但是,如果正则表达式包含文字 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]+\\.)?[ ]*'
我在 Python 方面还不是很有经验,所以我可能会误解。任何解释或教程链接(对于 Python 3.x;我在网上看到的大部分内容都是针对 2.x)将不胜感激。