Unicode规范化
Unicode Normalization
是否有可能的规范化路径使两个字符串低于相同的值?
u'Aho\xe2\u20ac\u201cCorasick_string_matching_algorithm'
u'Aho\u2013Corasick string matching algorithm'
看起来你那里有一个 Mojibake,UTF-8 字节已被解码,就好像它们是 Windows-1252 数据一样。您的 3 'characters',编码为 Windows-1252,为目标字符串中的 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 修复该数据,因此您会得到字节的破折号:
>>> 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 错误,以自动处理多个可能的编解码器错误。
是否有可能的规范化路径使两个字符串低于相同的值?
u'Aho\xe2\u20ac\u201cCorasick_string_matching_algorithm'
u'Aho\u2013Corasick string matching algorithm'
看起来你那里有一个 Mojibake,UTF-8 字节已被解码,就好像它们是 Windows-1252 数据一样。您的 3 'characters',编码为 Windows-1252,为目标字符串中的 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 修复该数据,因此您会得到字节的破折号:
>>> 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 错误,以自动处理多个可能的编解码器错误。