我正在处理外部网络服务,该服务错误地编码(和/或损坏)字符串(UTF-8
),这些字符串最有可能是ISO LATIN
或WINDOWS-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-8
。 Windows-1252
或ISO Latin
更加复杂,因为数据不会丢失,但经常会混淆。这是因为那些编码可以是两个字节,而不是UTF-8
的子集。
如果您不相信我,可以尝试使用各种编码进行getBytes()
,并且会看到数据损坏和数据丢失。
答案 0 :(得分:0)
我可能误解了错误编码数据的性质,但PHP代码对我来说似乎有些过分。如果你有UTF-8字节作为单个字符传递,你应该能够做:
String fix(String s) {
byte[] bytes = s.getBytes(Charset.forName("windows-1252"));
return new String(bytes, StandardCharsets.UTF_8);
}