为什么chardet说我的UTF-8编码字符串(最初从ISO-8859-1解码)是ASCII?

use*_*829 7 python encoding ascii utf-8 decoding

我正在尝试将ascii字符转换为utf-8.下面这个小例子仍然返回ascii字符:

chunk = chunk.decode('ISO-8859-1').encode('UTF-8')
print chardet.detect(chunk[0:2000])
Run Code Online (Sandbox Code Playgroud)

它返回:

{'confidence': 1.0, 'encoding': 'ascii'}
Run Code Online (Sandbox Code Playgroud)

怎么会?

aIK*_*Kid 8

引用Python的文档:

UTF-8有几个方便的属性:

  1. 它可以处理任何Unicode代码点.

  2. Unicode字符串变为一个字节字符串,不包含嵌入的零字节.这避免了字节排序问题,并且意味着UTF-8字符串可以由诸如strcpy()之类的C函数处理,并通过无法处理零字节的协议发送.

  3. ASCII字符串也是有效的UTF-8文本.

所有ASCII文本也是有效的UTF-8文本.(UTF-8是ASCII的超集)

要清楚说明,请查看此控制台会话:

>>> s = 'test'
>>> s.encode('ascii') == s.encode('utf-8')
True
>>> 
Run Code Online (Sandbox Code Playgroud)

但是,并非所有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)
>>> 
Run Code Online (Sandbox Code Playgroud)

所以,chardet仍然是对的.只有当一个字符不是ascii时,chardet才能告诉它,它不是ascii编码的.

希望这个简单的解释有所帮