【问题标题】:Unicode NormalizationUnicode 规范化
【发布时间】:2015-04-28 12:20:51
【问题描述】:

是否有可能的规范化路径使下面的两个字符串具有相同的值?

  • u'Aho\xe2\u20ac\u201cCorasick_string_matching_algorithm'
  • u'Aho\u2013Corasick string matching algorithm'

【问题讨论】:

  • 我知道有很多关于 unicode 处理的帖子。更具体地与上述示例相关,stackoverflow.com/questions/2971634/… 但它与一些 MYSQL 加载及其设置有关
  • 你能解释一下什么是“规范化”路径吗?
  • 为什么这两个字符串完全一样?一个使用–,另一个使用短划线。你是在说修理 Mojibake 吗?
  • 更不用说下划线到空格了。
  • U+2013 是短划线,U+20AB 是欧元符号。没有 Unicode 规范化会改变(不涉及组合字符)。您是否将编码与代码点混淆了?

标签: python python-2.7 unicode mojibake


【解决方案1】:

看起来您在那里有一个Mojibake,UTF-8 字节已被解码,就好像它们是 Windows-1252 数据一样。编码为 Windows-1252 的 3 个“字符”为目标字符串中的 U+2013 EN DASH 字符生成精确的 3 个 UTF-8 字节:

>>> u'\u2013'.encode('utf8')
'\xe2\x80\x93'
>>> u'\u2013'.encode('utf8').decode('windows-1252')
u'\xe2\u20ac\u201c'

您可以使用 ftfy module 来修复该数据,因此您会得到一个 emdash 字节:

>>> import ftfy
>>> sample = u'Aho\xe2\u20ac\u201cCorasick_string_matching_algorithm'
>>> ftfy.fix_text(sample)
u'Aho\u2013Corasick_string_matching_algorithm'

然后简单地将下划线替换为空格:

>>> ftfy.fix_text(sample).replace('_', ' ')
u'Aho\u2013Corasick string matching algorithm'

您也可以简单地编码为 Windows-1252 并再次解码为 UTF-8,但这并不总是有效,因为有些特定字节无法合法地解码为 Windows-1252,但是一些生产这些 Mojibakes 的系统无论如何都会这样做。 ftfy 包括专门的修复编解码器来逆转该过程。此外,它还会检测特定的 Mojibake 错误,以便跨多个可能的编解码器错误自动执行该过程。

【讨论】:

    猜你喜欢
    • 2013-05-04
    • 2011-12-08
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多