Другие ответы не работают правильно для суррогатных пар, например, если у вас есть смайлики, такие как «?» (см. информация о символах ).Вот как это сделать в Java 8:
StringBuilder sb = new StringBuilder();
s.codePoints().forEach(codePoint -> {
if (Character.UnicodeBlock.of(codePoint) != Character.UnicodeBlock.BASIC_LATIN) {
sb.append("&#");
sb.append(codePoint);
sb.append(';');
} else {
sb.appendCodePoint(codePoint);
}
});
А для более старой Java:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); ) {
int c = s.codePointAt(i);
if (Character.UnicodeBlock.of(c) != Character.UnicodeBlock.BASIC_LATIN) {
sb.append("&#");
sb.append(c);
sb.append(';');
} else {
sb.appendCodePoint(c);
}
i += Character.charCount(c);
}
Простой способ проверить, правильно ли решение обрабатывает суррогатные пары, - это использовать "\uD83D\uDE00"
(?) в качестве входа.Если вывод "��"
, то это неправильно.Правильный вывод 😀
.