Материал в квадратных скобках, похоже, представляет собой символы, закодированные в UTF-8, но странным образом преобразованные в шестнадцатеричную строку. Что вы можете сделать, так это найти каждый экземпляр, который выглядит как [0xc3]
, и преобразовать его в соответствующий байт, а затем создать новую строку из байтов.
К сожалению, хороших инструментов для работы с байтовыми массивами нет. Вот быстрое и грязное решение, которое использует регулярное выражение для поиска и замены этих шестнадцатеричных кодов соответствующим символом в латинице-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);
}