Java库使用启发式方法修复错误编码的文本

时间:2012-12-14 20:32:42

标签: java utf-8 character-encoding heuristics

我正在处理外部网络服务,该服务错误地编码(和/或损坏)字符串(UTF-8),这些字符串最有可能是ISO LATINWINDOWS-1252,但现在UTF-8(和/或ISO / WINDOWS / UTF-8的混合)。可爱的帽子(Â)比比皆是。

我显然无法修复外部Web服务如何存储其字符串以便丢失信息。因此,我所知道的100%翻译的希望是不可能的。

但我希望有人用Java编写了一个启发式字符映射库(不太可能有人会输入A帽子)。

如果不是,我想我可以移植这些人PHP代码:https://stackoverflow.com/a/3521340/318174

更新和说明:像@VGR这样的简单转换将无效。我没有原始字节。数据在端点处转换不正确(SOAP服务器可能getBytes(/*with out correct encoding*/)已完成,或者数据可能以不正确的格式存储)。当您将字节转换为Java中的字符串时,除非编码在任何地方都相同,否则不会保留数据。如果你想到像ASCII< - >这样的东西,这很容易理解。 UTF-8Windows-1252ISO Latin更加复杂,因为数据不会丢失,但经常会混淆。这是因为那些编码可以是两个字节,而不是UTF-8的子集。

如果您不相信我,可以尝试使用各种编码进行getBytes(),并且会看到数据损坏和数据丢失。

1 个答案:

答案 0 :(得分:0)

我可能误解了错误编码数据的性质,但PHP代码对我来说似乎有些过分。如果你有UTF-8字节作为单个字符传递,你应该能够做:

String fix(String s) {
    byte[] bytes = s.getBytes(Charset.forName("windows-1252"));
    return new String(bytes, StandardCharsets.UTF_8);
}