在为文件管理编写一次性脚本时,我经常使用print
函数来验证是否例如我正在操作的文件列表是我想要的。考虑例如
for path in glob.glob("*.mp3"):
print(path)
在Windows上(包括使用LANG=C
时的Cygwin,因此这也适用于Unix)如果文件名包含unicode字符,这将引发UnicodeEncodeError
。
在Cygwin中,当使用print(repr(path))
时,不受支持的字符将转义为\uxxxx
。但是,在Windows控制台中,它仍然会引发UnicodeEncodeError
。
我发现最接近解决方案的是
unicodestring = "Hello \u2329\u3328\u3281\u1219 World"
print(repr(unicodestring).encode("utf8").decode(sys.stdout.encoding))
# Breaks even supported characters
print(unicodestring.encode("unicode-escape").decode("ascii"))
对于“快速和脏”脚本而言,这两者都相当冗长,特别是当打印调用包含多个具有可能的非ascii内容的字符串时。
Python 2存在类似的问题,但这些解决方案通常不适用于Python 3.此外,它们通常同样冗长。