Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么chardet说我的UTF-8编码字符串(最初从ISO-8859-1解码)是ASCII码?_Python_Encoding_Utf 8_Ascii_Decoding - Fatal编程技术网

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

Python 为什么chardet说我的UTF-8编码字符串(最初从ISO-8859-1解码)是ASCII码?,python,encoding,utf-8,ascii,decoding,Python,Encoding,Utf 8,Ascii,Decoding,我正在尝试将ascii字符转换为utf-8。下面这个小示例仍然返回ascii字符: chunk = chunk.decode('ISO-8859-1').encode('UTF-8') print chardet.detect(chunk[0:2000]) 它返回: {'confidence': 1.0, 'encoding': 'ascii'} 为什么会这样?引用Python的话: UTF-8有几个方便的特性: 它可以处理任何Unicode代码点 Unicode字符串转换为不包含嵌入零字

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

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

{'confidence': 1.0, 'encoding': 'ascii'}
为什么会这样?

引用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)
    >>> 
    
    >>foreign_string=u“u”
    >>>外来字符串编码('utf-8')
    “\xc3\xa9\xc3\xa2\xc3\xb4”
    >>>foreign_string.encode('ascii')#这不起作用,因为它在ascii编码中无效
    回溯(最近一次呼叫最后一次):
    文件“”,第1行,在
    外来字符串编码('ascii')
    UnicodeEncodeError:“ascii”编解码器无法对位置0-2中的字符进行编码:序号不在范围内(128)
    >>> 
    
    所以,
    chardet
    仍然正确。只有当有一个字符不是ascii时,
    chardet
    才能判断它不是ascii编码的


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

    这就是您获得
    ascii

    如果序列中的所有字符都是<代码> ASCII 符号>代码> CARDET < /代码>将字符串编码视为<代码> ASCII

    注意

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

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

    “foobar”。encode('UTF-8')
    foobar