如何解码混淆字符编码:特殊字符编码

3
我有一些以CSV格式存储的数据,字符编码已经严重混乱,很可能在不同的软件(LibreOffice Calc、Microsoft Excel、Google Refine和自定义PHP/MySQL软件)之间来回转换,这些软件运行在Windows XP、Windows 7和世界各地的GNU/Linux机器上。在这个过程中,非ASCII字符似乎已经严重混乱,我不知道如何将它们解密或者检测出模式。如果手工操作,需要处理几千条记录...

这里举个例子,在CSV文件中有"Trois-Rivières",当我在Python中打开这部分CSV文件时,它显示:

Trois-Rivi\xc3\x83\xc2\x85\xc3\x82\xc2\xa0res

问题:我该通过什么过程来逆转?

\xc3\x83\xc2\x85\xc3\x82\xc2\xa0

获取返回值

è

即,我该如何解决这个问题?这个问题最初是如何出现的?我该如何逆向工程处理这个错误?


1
它看起来有点像 utf8 覆盖 iso 覆盖 utf8... 也许你应该尝试使用 iconv - fge
2
我怀疑\xc3\x83\xc2\x85\xc3\x82\xc2\xa0不能转换为单个的è - Oded
1
看起来它已经损坏到无法修复的程度(很可能是由于在此之前进行了错误的字符集转换)。我看不出比utf8更合理的解释,但即使是这样,它看起来仍然是损坏的。 - sehe
我认为你是对的,由于过去多次错误的字符集转换,已经损坏无法修复...谢谢。 - balleyne
2
看起来像是双重UTF-8编码后被ISO-8859-1误解释成了UTF-8,但是用这种方式解码得到的是U+0160(Š),而不是预期的U+00E8(è)。 - dan04
显示剩余2条评论
2个回答

3
您可以查看以下提供的解决方案:Python中双重解码Unicode 另一个更简单的暴力解决方案是创建一个映射表,使用正则表达式(((\\\x[a-c0-9]{2}){8}))搜索您的输入文件中少量的混淆字符。对于单个来源的文件,法语应该小于32,德语应该小于10。然后,您可以使用这个小映射表运行“查找和替换”操作。

2
根据上面dan04的评论,我们可以猜测字母“è”被误解为“Š”,然后对其应用了三重UTF-8编码。
那么,“è”是怎么变成“Š”的呢?我有一个想法,最可能的解释之一是在两个不同的8位字符集之间,所以我在维基百科上查找了一些常见字符编码,并找到了一个匹配项:在CP850(以及其他各种相关的8位DOS代码页,如CP851、CP853、CP857等)中,“è”被编码为0x8A字节,在Windows-1252中则表示“Š”。
有了这个知识,我们可以用一个简单的Unix shell命令行重新创建这个曲折的误编码链:
echo "Trois-Rivières" \
  | iconv -t cp850 \
  | iconv -f windows-1252 -t utf-8 \
  | iconv -f iso-8859-1 -t utf-8 \
  | iconv -f iso-8859-1 -t utf-8 \
  | iconv -f ascii --byte-subst='\x%02X'

Trois-Rivi\xC3\x83\xC2\x85\xC3\x82\xC2\xA0res

在这里,第一个iconv调用将字符串从本地字符编码(UTF-8)转换为CP850,最后一个调用则使用Python风格的\xNN转义代码对非ASCII字节进行编码。中间的三个iconv调用重新创建了应用于数据的实际重新编码步骤:首先从(假定的)Windows-1252到UTF-8,然后两次从ISO-8859-1到UTF-8。
那么我们该如何解决呢?好吧,我们只需要按相反的步骤进行即可。
$ echo -e 'Trois-Rivi\xC3\x83\xC2\x85\xC3\x82\xC2\xA0res' \
  | iconv -f utf-8 -t iso-8859-1 \
  | iconv -f utf-8 -t iso-8859-1 \
  | iconv -f utf-8 -t windows-1252 \
  | iconv -f cp850

Trois-Rivières

好消息是这个过程应该是大部分可逆的。坏消息是,原始文本中任何“ü”、“ì”、“Å”、“É”和“Ø”字母可能已经被不可逆地破坏了,因为在Windows-1252中用于编码这些字母的字节未在CP850中定义。(如果你很幸运,它们可能已被解释为ISO-8859-1中那些字节所代表的相同C1控制码,理论上可以进行反向转换。但我还没有找到如何说服iconv这样做的方法。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接