8

I'm trying to convert ascii characters to utf-8. This little example below still returns ascii characters:

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

It returns:

{'confidence': 1.0, 'encoding': 'ascii'}

How come?

4

3 回答 3

9

引用 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
>>> 

但是,并非所有 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 编码的。

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

于 2013-10-29T08:29:32.480 回答
3

UTF-8 是ASCII的超集。这意味着每个有效的 Ascii 文件(仅使用前 128 个字符,而不是扩展字符)也将是有效的 UTF-8 文件。由于编码没有显式存储,而是每次都猜测,因此它将默认为更简单的字符集。但是,如果您要在 UTF-8 中编码超出基本 128 个字符(如外国文本等)的任何内容,则很有可能将编码猜测为 UTF-8。

于 2013-10-29T08:31:48.740 回答
1

这就是你得到的原因ascii

https://github.com/erikrose/chardet/blob/master/chardet/universaldetector.py#L135

如果序列中的所有字符都是ascii符号,则将chardet字符串编码视为ascii

注意

Unicode 的前 128 个字符与 ASCII 一对一对应,使用与 ASCII 具有相同二进制值的单个八位字节进行编码,从而使有效的 ASCII 文本也成为有效的 UTF-8 编码的 Unicode。

于 2013-10-29T08:30:33.780 回答