【问题标题】:How to diagnose, and reverse (not prevent) Unicode mangling如何诊断和逆转(而不是阻止)Unicode 修改
【发布时间】:2010-06-02 05:40:39
【问题描述】:

在我上游的某个地方,发生了“某事”,看起来像是 unicode 修改。一个症状是小写的 u 变音符号 (ü) 被转换为“ü”(即字符 FC 被转换为 C3 BC)。假设我无法控制这个上游流程,我该如何对正在发生的事情进行逆向工程?如果可以的话,我可以将香肠机向后转动并恢复原始文本吗?

(如果有助于理解这个案例,我收到的文本是 MySQL 转储的形式。我认为它在转储/传输过程中的某个地方被破坏了。)

【问题讨论】:

    标签: unicode string reverse-engineering corruption


    【解决方案1】:

    您的文字没有“损坏”。它只是在 UTF8 中。 C3 BC 是 应该 被编码为的 ü。只需将您使用的任何软件也设置为 UTF8,所有痛苦都会消失。如果您无法将软件设置为 Unicode,请认真考虑切换到更新的软件。

    一开始我知道这很可怕,但无论如何,你最终还是必须这样做。我最喜欢的音乐排字机不久前切换到仅 Unicode 输入(他们甚至故意删除对旧 8 位代码页的支持以让人们切换),我很沮丧,认为 Latin-1 对我来说已经足够好了,破坏运行良好的东西是愚蠢的......然后我克服了它,只是将 emacs 设置为 Unicode 缓冲区,现在我再也不用考虑字符编码了!

    【讨论】:

      【解决方案2】:

      首先,您似乎有 UTF-8 编码的文本(因为您发现 ü 以您预期的编码解释,可能是 Latin-1)。

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

      要将文本恢复为所需的编码,可以使用多种工具,GNU recode 之一。

      【讨论】:

      • 谢谢 - 维基百科的文章解释了很多。所以基本上我所拥有的是一个字符串(在 Java 中),它由不知何故错过了从 UTF-8 解码的字符组成。所以最后的修复包括替换: x = results.getString("field"); with x = new String(rs.getBytes("field"), "UTF-8");大概我会找到一种更优雅的方式来做到这一点,但这是向前迈出的一大步,尤其是在我的理解中。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-22
      • 2015-04-30
      • 2019-07-21
      • 2010-12-24
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      相关资源
      最近更新 更多