6

我正在处理一个外部 Web 服务,它给了我错误编码(和/或损坏)的字符串UTF-8( 可爱的 A 帽子 ( ) 比比皆是。ISO LATINWINDOWS-1252UTF-8Â

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

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

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

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

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

4

1 回答 1

0

我可能误解了错误编码数据的性质,但 PHP 代码对我来说似乎有点矫枉过正。如果您有作为单个字符传递的 UTF-8 字节,您应该能够执行以下操作:

String fix(String s) {
    byte[] bytes = s.getBytes(Charset.forName("windows-1252"));
    return new String(bytes, StandardCharsets.UTF_8);
}
于 2012-12-15T01:14:58.643 回答