繁体   English   中英

如何在 Python 中区分正确和拙劣的 unicode 编码字符串?

[英]How to distinguish between a correct and a botched unicode encoded string in Python?

我有各种语言的字符串数据,其中部分字符串出现了一些错误的编码/解码,而其他部分是正确的,我需要修复错误的:

以下是德语单词“Zubehör”的示例:

correct = "ZUBEHÖR"
incorrect = "ZUBEHÃ\x96R"

我已经发现我可以纠正这样的错误:

incorrect.encode("raw_unicode_escape").decode("utf8")

但是,在正确的字符串上使用它会产生错误。 我可以遍历所有字符串并使用try语句,但我不知道这是否能可靠地工作,我想知道一种更优雅的方式。

此外,虽然\\x96在打印时被写出,但它实际上只有一个字符:

incorrect[-3]
Out[34]: 'Ã'

incorrect[-2]
Out[33]: '\x96'

我怎样才能可靠地只找到那些像ZUBEHÃ\\x96R那样包含这些奇怪的 unicode 字符的字符串?

编辑:

这是我在试验时偶然发现的其他东西:

当我执行incorrect.encode("raw_unicode_escape") ,结果是b'ZUBEH\\xc3\\x96R'

但是当我用这样的西里尔字母来做这个时:

"Персонализированные".encode("raw_unicode_escape")

那么结果是b'\\\П\\\е\\\р\\\с\\\о\\\н\\\а\\\л\\\и\\\з\\\и\\\р\\\о\\\в\\\а\\\н\\\н\\\ы\\\е'

为什么我在第一种情况下得到\\x -escapes 而在第二种情况下得到\\u\u003c/code> -escapes 同时做完全相同的事情?

为什么我可以.decode("utf8")\\x -escapes 转换为可读格式而不是\\u\u003c/code> -escapes?

您应该尝试fix -text-for-you 库 ( ftfy ):

>>> import ftfy
>>> ftfy.fix_text("ZUBEHÃ\x96R")
'ZUBEHÖR'

它逐行运行,因此如果您有一个包含干净和损坏字符串的字符串,但在单独的行上,ftfy 可能可以处理它。

注意:这不是一门精确的科学。 ftfy 的工作方式涉及很多有根据的猜测。 该工具制作精良,但可能无法在您拥有的所有情况下正确猜测。 如果可以,最好在源头修复错误(即确保首先正确解码所有文本)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM