【问题标题】:Same character, different length and bytes [duplicate]相同的字符,不同的长度和字节[重复]
【发布时间】:2018-07-10 06:37:43
【问题描述】:

从韩国网站下载文件时,文件名经常被错误地编码/解码,最终变得混乱。我发现通过使用“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”对第一个字符串进行编码。后者不是。那么问题来了:

  1. 这两个字符串有什么区别?
  2. 为什么从同一个网站下载的内容会有不同格式的相同字符? (如果这就是区别。)
  3. 我该如何解决这个问题? (例如,将second_string 转换为first_string 的肖像)

谢谢。

【问题讨论】:

  • 这些不是同一个字符:第一个有波浪号。

标签: python unicode character-encoding


【解决方案1】:
  1. 一个简单的方法是询问 vim 究竟是什么字符。将光标放在一个字符上并输入ga 以获取有关它的信息。

    第一个是:

    <â> 226, Hex 00e2, Octal 342
    

    第二个:

    <a>  97,  Hex 61,  Octal 141 < ̂> 770, Hex 0302, Octal 1402
    

    换句话说,第一个是complete "a with circumflex" character,第二个是regular a,然后是circumflex combining character

  2. 询问网站运营商。我们怎么知道?!

  3. 您需要将组合字符转换为常规字符的东西。例如,谷歌搜索得到this question

    正如您在评论中指出的那样,正如 clemens 在另一个答案中指出的那样,在 Python 中,您可以使用 unicodedata.normalize 和 'NFC' 作为形式。

【讨论】:

  • 我使用 Python 的 unicodedata.normalize 和 'NFC' 作为形式进行规范化并且编码顺利进行。 – Jake Hyun 13 秒前编辑
  • 酷。我会把它添加到答案中。
【解决方案2】:
  1. 在 Unicode 中有不同的重音和分音符号表示。在代码点 U+00E2 处有一个字符,COMBINING CIRCUMFLEX ACCENT (U+0302) 由 Python 2.7 中的u'a\u0302' 创建。它由两个字符组成:'a' 和抑扬符。

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

  3. 您最多可以使用unicodedata.normalize 将组合字符转换为单个字符,例如:

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

将输出â 2 1

【讨论】:

    猜你喜欢
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多