2010-06-02 41 views
2

在我的上游某处,“某些事情”发生,看起来像unicode mangling。一个症状是小写字母变音(ü)被转换为“Ô(即字符FC被转换为C3 BC)。假设我无法控制这个上游流程,那我该如何进行反向工程?如果可能的话,我可以向后摇动香肠机并获得原始文本吗?如何诊断和反转(而不是阻止)Unicode损坏

(如果它有助于了解这种情况下,我收到的文本是在一个MySQL转储形式。我认为somwewhere转储/运输过程中它得到了错位。)

回答

2

首先,它看起来就像你已经得到UTF-8编码文本一样(因为你发现ü在你期望的编码中被解释,可能是Latin-1)。

您可以通过检查是否使用正确的字节序列(以及当然没有使用的非法字节序列)来猜测这种编码。请参阅the Wikipedia article以供参考,并查找有效和无效的字节序列。如果文本以BOM开头,那么您可以非常确定编码,但UTF-8不需要这样做。

要使文本重新获得所需的编码,可以使用几种工具,其中一个为GNU recode

+0

谢谢 - 维基百科文章解释了很多。所以基本上我所拥有的是一个字符串(用Java编写),它由一些不知何故错过了从UTF-8解码的字符组成。所以最终的修复包括替换: x = results.getString(“field”); 与 x = new String(rs.getBytes(“field”),“UTF-8”); 大概我会找到一个更优雅的做法,但这是一大进步,尤其是在我的理解。谢谢。 – 2010-06-03 00:36:32

4

您的文字不是'损坏'。它只是UTF8。 C3 BC是什么ü假设被编码为。只要设置你使用UTF8的任何软件,所有的痛苦都会消失。如果您不能将软件设置为Unicode,请认真考虑切换到较新的软件。

我知道它起初很可怕,但最终你必须这样做,无论如何。我最喜欢的音乐排字工具刚刚转换为仅支持Unicode的输入法(他们甚至故意删除对旧版8位代码页的支持以让人们切换),而且我很不高兴,认为Latin-1对我来说足够好,而且破解工作得很好的东西是愚蠢的......然后我克服了它,只是将emacs设置为Unicode缓冲区,现在我再也不用在我的生活中再考虑字符编码了!