方括号内的内容似乎是用 UTF-8 编码的字符,但以一种奇怪的方式转换为十六进制字符串。您可以做的是找到每个看起来像的实例[0xc3]
并将其转换为相应的字节,然后从字节中创建一个新字符串。
不幸的是,没有很好的工具来处理字节数组。这是一个快速而肮脏的解决方案,它使用正则表达式来查找这些十六进制代码并将其替换为 latin-1 中的相应字符,然后通过重新解释字节来修复它。
String bracketDecode(String str) {
Pattern p = Pattern.compile("\\[(0x[0-9a-f]{2})\\]");
Matcher m = p.matcher(str);
StringBuilder sb = new StringBuilder();
while (m.find()) {
String group = m.group(1);
Integer decode = Integer.decode(group);
// assume latin-1 encoding
m.appendReplacement(sb, Character.toString(decode));
}
m.appendTail(sb);
// oh no, latin1 is not correct! re-interpret bytes in utf-8
byte[] bytes = sb.toString().getBytes(StandardCharsets.ISO_8859_1);
return new String(bytes, StandardCharsets.UTF_8);
}