从破碎的ISO-Latin-1序列中恢复UTF-8

时间:2012-11-05 14:19:44

标签: utf-8 character-encoding

我最近遇到了几个破坏的UTF-8字符串,这些字符串转换为我认为是ISO-Latin-1的字符串,我想知道是否有一些工具可以用来自动转换回来,因为没有信息被实际销毁,实际上没有任何比特丢失。

基本上这样的事情会采用一系列字符并显示如果相同的位显示为utf-8或其他编码,它们将会是什么样的。这样的工具存在吗? (我知道自己创建一些东西很容易,或者甚至只是手动完成它,所以如果真的没有,我可能会这样做。)

澄清:我遇到的具体情况是,在特定论坛上,文本编辑器允许使用utf-8字符,但论坛本身会显示与utf-8字符的各个字节对应的字符。

对于字符U + 0000到U + 007F,它是完全相同的字符,但是:

  • U + 0080到U + 07FF字符显示为U + 00C0和U + 00DF之间的一个字符,后跟U + 0080和U + 00BF之间的一个字符
  • U + 0800到U + FFFF字符显示为U + 00E0和U + 00EF之间的一个字符,后跟U + 0080到U + 00BF之间的两个字符

依旧......

所以“ ”实际应该显示为字符U + 2xy6,(x是' '的中间4位,y是' '加上'10'的最后2位。)

虽然我仍然无法弄清楚U + 0080和U + 00BF' '之间究竟有哪些字符。

我要做的是获取所有UTF-8字符串的字符的ISO-Latin-1位值,将它们连接在一起,并将结果位序列解释为包含UTF-8编码字符。

2 个答案:

答案 0 :(得分:0)

UTF8 - >不幸的是,拉丁1是有损的。 UTF8解析为latin1 - > UTF8不是。我认为这是你的情况。 如果是这样,那么你可以在linux上反向像:

iconv -f utf8 -t iso-8859-1 < bad.file.latin1 > good.file.utf8

如果中间转换是像cp1252那样有损耗的话 然后这些过程更加复杂,需要一些东西 喜欢详见:

http://www.pixelbeat.org/docs/unicode_utils/

答案 1 :(得分:0)

很抱歉地说,但这并没有多大意义。 :)

场景1:像“Héllöwörld”这样的字符串,包含UTF-8和Latin1中有效的字符,从UTF-8正确转换为Latin1:没问题。你现在只需要在Latin1中解释它。

场景2:像“Hello世界”这样的字符串,其中包含以UTF-8有效但在Latin1中无效的字符,已正确地从UTF-8转换为Latin1:在这种情况下,字符在Latin1中无法表示的可能已被?取代,即字符串现在是“Hello ??”,你无能为力。

场景3:像“Héllö世界”这样的字符串,包含任何类型的字符并保存为UTF-8,从假定的Latin1转换为UTF-8。这意味着字符被误解,但现在正确编码为UTF-8:“Héllöä¸ç”。在这种情况下,您可以反转编码UTF-8→Latin1并将结果解释为UTF-8以获取原始文件。

场景4:像“HéllöWörld”这样的字符串,其中包含Latin1字符并保存为Latin1,被误解为UTF-8,然后保存为UTF-8,在这种情况下它现在是“H ll W rld”。此字符串现在无法恢复。

发生的事情有很多种可能的组合,如果没有更多的信息,就不可能准确地告诉你能做什么或不做什么。首先,确保 正在正确解释字符串,这不仅仅是显示问题。

你在那里看到“ ”的事实表明你试图将某些东西解释为UTF-8,但是UTF-8解码器无法理解这些字符并用“ ”代替它们。这是你现在的错,数据很好,或情况4。