引用 Python 的文档:
UTF-8 有几个方便的属性:
它可以处理任何 Unicode 代码点。
Unicode 字符串被转换为不包含嵌入零字节的字节串。这避免了字节排序问题,并且意味着 UTF-8 字符串可以由诸如 strcpy() 之类的 C 函数处理,并通过无法处理零字节的协议发送。
ASCII 文本字符串也是有效的 UTF-8 文本。
所有 ASCII 文本也是有效的 UTF-8 文本。(UTF-8 是 ASCII 的超集)
为了清楚起见,请查看此控制台会话:
>>> s = 'test'
>>> s.encode('ascii') == s.encode('utf-8')
True
>>>
但是,并非所有 UTF-8 编码的字符串都是有效的 ASCII 字符串:
>>> foreign_string = u"éâô"
>>> foreign_string.encode('utf-8')
'\xc3\xa9\xc3\xa2\xc3\xb4'
>>> foreign_string.encode('ascii') #This won't work, since it's invalid in ASCII encoding
Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
foreign_string.encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
>>>
所以,chardet
还是对的。只有当有一个不是 ascii 的字符时,chardet
才能知道它不是 ascii 编码的。
希望这个简单的解释有所帮助!