Python 相同的字符、不同的长度和字节

Python 相同的字符、不同的长度和字节,python,unicode,character-encoding,Python,Unicode,Character Encoding,从韩国网站下载文件时,文件名通常会被错误编码/解码,最终会变得一团糟。我发现通过使用“iso-8859-1”编码和使用“euc kr”解码,我可以解决这个问题。然而,我有一个新的问题,相同的角色实际上是不同的。查看下面的Python shell文件: >>> first_string = 'â' >>> second_string = 'â' >>> len(first_string) 1 >>> len(second_s

从韩国网站下载文件时,文件名通常会被错误编码/解码,最终会变得一团糟。我发现通过使用“iso-8859-1”编码和使用“euc kr”解码,我可以解决这个问题。然而,我有一个新的问题,相同的角色实际上是不同的。查看下面的Python shell文件:

>>> first_string = 'â'
>>> second_string = 'â'
>>> len(first_string)
1
>>> len(second_string)
2
>>> list(first_string)
['â']
>>> list(second_string)
['a', '̂']
>>>
可以使用“iso-8859-1”对第一个字符串进行编码。后者并非如此。因此,问题是:

  • 这两个字符串之间有什么区别
  • 为什么从同一个网站下载的内容会有不同格式的相同字符?(如果这就是区别所在。)
  • 我怎样才能解决这个问题?(例如,将
    第二个\u字符串
    转换为
    第一个\u字符串
  • 多谢各位

  • 要想知道一个角色到底是什么,一个简单的方法是询问vim。将光标放在字符上,然后键入
    ga
    以获取有关该字符的信息

    第一个是:

    <â> 226, Hex 00e2, Octal 342
    
    226,十六进制00e2,八进制342
    
    第二点:

    <a>  97,  Hex 61,  Octal 141 < ̂> 770, Hex 0302, Octal 1402
    
    ,第二个是a,后面跟着a

  • 询问网站运营商。我们怎么知道

  • 你需要一些能将组合字符转换成常规字符的东西。例如,谷歌搜索就产生了这样的结果

    正如您在评论中指出的,正如克莱门斯在另一个回答中指出的,在Python中,您可以使用“NFC”作为形式

  • 在Unicode中,重音和分隔符有不同的表示形式。在代码点U+00E2处有一个字符,以及由Python 2.7中的
    U'a\u0302'
    创建的
    组合扬抑重音(U+0302)。它由两个字符组成:a和扬抑符

  • 不同表述的一个可能原因是,网站创建者从不同来源复制了文本。例如,PDF文档通常使用两个复合字符显示UMLAUT和重音符号,而在键盘上键入这些字符通常会生成单字符表示

  • 您可以最大限度地使用Unicode数据。规范化将组合字符转换为单个字符,例如:

    from unicodedata import normalize
    
    s = u'a\u0302'
    print s, len(s), len(normalize("NFC", s))
    

  • will output
    –2 1

    这些字符不一样:第一个字符有一个波浪号。我使用Python和“NFC”作为表单进行规范化,编码进行得很顺利13秒前的Jake Hyun很酷。我将把它添加到答案中。