getdefaultencoding
与源文件或终端的编码无关。它是用于将字节字符串隐式转换为Unicode字符串的编码,并且在Python 2.X中应始终为'ascii'(在Python 3.X中为'utf8')。
在Python 2.X中,如果您在未声明编码的脚本中使用您的代码行,则会产生错误:
SyntaxError: Non-ASCII character '\x87' in file ...
实际的非ASCII字符可能会有所不同,但是如果没有编码声明,它将无法工作。在Python 2.X中使用非ASCII字符必须要有一个编码声明,而且这个编码声明必须和源文件编码一致。例如:
value = '國華'
保存为cp936格式会产生以下结果:
SyntaxError: 'utf8' codec can't decode byte 0x87 in position 9: invalid start byte
当编码正确时,字节字符串中的字节确实是源文件中的内容,因此它将包含字符的编码字节。当Python解析Unicode字符串时,使用声明的源编码将字节解码为Unicode。请注意,在cp936控制台上打印UTF-8字节字符串和Unicode字符串时的区别:
# coding: utf8
value = '國華'
print value,repr(value)
value = u'國華'
print value,repr(value)
输出:
鍦嬭彲 '\xe5\x9c\x8b\xe8\x8f\xaf'
國華 u'\u570b\u83ef'
该字节字符串包含两个字符的3字节UTF-8编码,但由于cp936终端不理解该字节序列,因此显示不正确。Unicode打印正确,并且该字符串包含从源文件的UTF-8字节解码的Unicode代码点。
请注意,在声明和使用与终端匹配的编码时存在区别:
# coding: cp936
value = '國華'
print value,repr(value)
value = u'國華'
print value,repr(value)
输出:
國華 '\x87\xf8\xc8A'
國華 u'\u570b\u83ef'
字节字符串中的内容现在是两个字符('A'等于'\x41')的2字节cp936编码,并且由于终端了解cp936字节序列,因此正确显示。Unicode字符串包含与先前示例中相同的两个字符的Unicode代码点,因为使用声明的源编码将源字节序列解码为Unicode。
如果脚本具有正确的源编码声明并在文本中使用Unicode字符串,则无论终端编码如何,都将显示正确的字符
1。如果终端不支持该字符,则会抛出UnicodeEncodeError而不是显示错误的字符。
最后注意:Python 2.X默认使用'ascii'编码,除非另行声明,并允许字节字符串中包含非ASCII字符(如果编码支持它们)。Python 3.X默认使用'utf8'编码(因此请确保以该编码保存或声明其他方式),并且不允许在字节字符串中包含非ASCII字符。
1如果终端字体支持该字符。
2如果终端编码支持该字符。
u
来解决问题? - abarnertsys.getdefaultencoding()
不同,因此您可能无法安全地解释它,但是字节确实存在。如果两个编码相同,并且终端的编码也相同,并且该编码可以处理这些字符,则甚至可以“打印值”并查看您期望的内容。这是您想要的吗,还是还有其他要求? - abarnert