июньское решение, упрощенное. Используя StringBuffer#appendCodePoint(int)
, мне не нужно char current
или String#charAt(int)
. Я могу сказать суррогатную пару, проверив, больше ли codePoint
чем 0xFFFF
.
(Необязательно делать i ++, так как низкий суррогат не прошел бы фильтр. Но тогда можно было бы повторно использовать код для различных кодовых точек, и он потерпел бы неудачу. Я предпочитаю программирование взлому.)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < text.length(); i++) {
int codePoint = text.codePointAt(i);
if (codePoint > 0xFFFF) {
i++;
}
if ((codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD)
|| ((codePoint >= 0x20) && (codePoint <= 0xD7FF))
|| ((codePoint >= 0xE000) && (codePoint <= 0xFFFD))
|| ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF))) {
sb.appendCodePoint(codePoint);
}
}