我有各种语言的字符串数据,其中字符串的某些部分看到了一些错误的编码/解码,而另一些是正确的,我需要修复错误的代码:
这是德语单词“Zubehör”的一个示例:
correct = "ZUBEHÖR"
incorrect = "ZUBEHÃ\x96R"
我已经发现我可以纠正这样的错误:
incorrect.encode("raw_unicode_escape").decode("utf8")
但是,在正确的字符串上使用它会产生错误。我可以遍历所有字符串并使用try
-statement,但是我不知道这是否可以可靠地工作,我想知道一种更优雅的方法。
此外,虽然\x96
在打印时将写入,但实际上只有一个字符:
incorrect[-3]
Out[34]: 'Ã'
incorrect[-2]
Out[33]: '\x96'
我如何才能可靠地仅找到像这样的字符串,这些字符串具有这些奇怪的unicode字符ZUBEHÃ\x96R
?
编辑:
这是我在实验中偶然发现的一些东西:
当我这样做时incorrect.encode("raw_unicode_escape")
,结果是b'ZUBEH\xc3\x96R'
。
但是当我用这样的西里尔字母来做这个时:
"Персонализированные".encode("raw_unicode_escape")
那么结果是 b'\\u041f\\u0435\\u0440\\u0441\\u043e\\u043d\\u0430\\u043b\\u0438\\u0437\\u0438\\u0440\\u043e\\u0432\\u0430\\u043d\\u043d\\u044b\\u0435'
为什么在做完全相同的事情时\x
在第一种情况下出现\u
-escapes而在第二种情况下出现-escapes?
为什么我.decode("utf8")
可以将\x
-escapes转换为可读格式,但不能将\u
-escapes转换为可读格式?
您应该尝试使用“ fixes-text-for-you”库(ftfy):
>>> import ftfy
>>> ftfy.fix_text("ZUBEHÃ\x96R")
'ZUBEHÖR'
它逐行操作,因此,如果您的字符串包含干净且损坏的字符串,但是在单独的行上,ftfy可能可以处理它。
注意:这不是一门精确的科学。ftfy的工作方式涉及很多有根据的猜测。该工具制作精良,但在所有情况下都可能无法正确猜测。如果可以,最好在源头处修复错误(即,确保首先正确解码所有文本)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句