Java解码双编码utf-8字符

Chr*_*h S 5 java encoding utf-8

我正在解析一个websocket消息,并且由于在特定的socket.io版本中发生了一个错误(不幸的是,我无法控制服务器端),因此某些有效载荷被双重编码为​​utf-8:

正确的值应该是Wroc?awskiej(请注意L字母是带有笔画的拉丁文小写字母L),但实际上我又返回了WrocÅawskiej

我已经尝试过使用Java再次对其进行解码/编码

String str = new String(wrongEncoded.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)

不幸的是,字符串保持不变。关于如何在Java中执行双重解码的任何想法?我看到了一个python版本,他们raw_unicode先将其转换为原始版本,然后再次对其进行解析,但是我不知道这种方法是否有效,或者是否存在类似的Java解决方案。我已经阅读了有关该主题的几篇文章,但没有任何帮助。

编辑:为了澄清在提琴手,我收到上述提到的单词以下字节序列:

WrocÃÂawskiej

byte[] arrOutput = { 0x57, 0x72, 0x6F, 0x63, 0xC3, 0x85, 0xC2, 0x82, 0x61, 0x77, 0x73, 0x6B, 0x69, 0x65, 0x6A };
Run Code Online (Sandbox Code Playgroud)

And*_*eas 7

您的文本已编码为UTF-8,然后将这些字节解释为ISO-8859-1并重新编码为UTF-8。

Wroc?awskiej是unicode:0057 0072 006f 0063 0142 0061 0077 0073 006b 0069 0065 006a
编码为UTF-8是:57 72 6f 63 c5 82 61 77 73 6b 69 65 6a

ISO-8859-1c5Å82不确定的
按照ISO-8859-1,这些字节是:WrocÅawskiej
编码为UTF-8:57 72 6f 63 c3 85 c2 82 61 77 73 6b 69 65 6a
这些可能是您正在接收的字节。

因此,要撤消该操作,您需要:

String s = new String(bytes, StandardCharsets.UTF_8);

// fix "double encoding"
s = new String(s.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
Run Code Online (Sandbox Code Playgroud)