0

我最近遇到了几个损坏的 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 是 '�' 的后 2 位加上 '10')。

虽然我仍然无法确切地弄清楚 U+0080 和 U+00BF '�' 之间的哪个字符。

我想要做的是获取所有 UTF-8 字符串字符的 ISO-Latin-1 位值,将它们连接在一起,并解释生成的位序列,就好像它包含 UTF-8 编码字符一样。

4

2 回答 2

1

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

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

场景 2:像"Hello 世界"这样的字符串,它包含在 UTF-8 中有效但在 Latin1 中无效的字符,被正确地从 UTF-8 转换为 Latin1:在这种情况下,在 Latin1 中不可表示的字符可能已被替换by ?,即字符串现在是“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。

于 2012-11-05T17:23:58.440 回答
0

不幸的是,UTF8 -> latin1 是有损的。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/

于 2012-11-05T17:07:32.543 回答