Если ваш сервер не возвращает ничего, кроме потока кодовых точек Unicode, закодированных в описываемой вами форме (без необработанных символов, например, только кодовые точки в форме \u1234
), тогда следующий код преобразует такую последовательность в декодированные символы:
public class UnicodeDecoder {
private static final Pattern UNICODE_CHARACTER_PATTERN =
Pattern.compile("\\\\u([0-9A-Fa-f]{2,4})");
public static void main(String[] args) {
String raw = "\\u05d0\\u05d1\\u05d2\\u05d3";
StringBuilder sb = new StringBuilder(raw.length() / 7);
Matcher matcher = UNICODE_CHARACTER_PATTERN.matcher(raw);
while (matcher.find()) {
String hexCode = matcher.group(1);
char[] decodedChars = Character.toChars(
Integer.valueOf(hexCode, 16));
sb.append(decodedChars);
}
System.out.println("Raw:\n"+raw);
System.out.println("Decoded:\n"+sb.toString());
}
}
Этот пример кода дает вывод:
Raw:
\u05d0\u05d1\u05d2\u05d3
Decoded:
אבגד
Обратите внимание, что этот метод не очень эффективен.Если производительность важна, вы можете переделать это так, чтобы вручную взять подстроку каждой последовательности \u1234
, а затем добавить декодированные символы в подстроку.Это позволило бы избежать затрат на сопоставление регулярных выражений.
И если ваш сервер возвращает символы, отличные от кодовых точек Unicode, вам придется перемещаться по ответам сервера за символом, проверяя наличие \u1234
последовательность.Все, что не является последовательностью кодов Unicode, должно быть добавлено непосредственно к вашему StringBuilder
;все, что является кодовой точкой Unicode, должно быть сначала декодировано в символы.