Действительно, utf8
в MySQL в то время был верным, поскольку многобайтовые последовательности UTF-8 имели не более 3 байтов. Но Unicode получил больше символов, и UTF-8 тоже вырос. И только utf8mb4
может сделать.
Однако до 3 байтов все в порядке:
return input
.codePoints()
.filter(codePoint -> codePoint >= 256) // Optional heuristic optimisation
.mapToObj(codePoint -> new String(Character.toChars(codePoint)))
.filter(cpString -> cpString.getBytes(StandardCharsets.UTF_8).length > 3)
.collect(Collectors.toSet())
Или просто все кодовые точки выше U + FFFF :
return input
.codePoints()
.filter(codePoint -> codePoint >= 0x1_0000)
.mapToObj(codePoint -> new String(Character.toChars(codePoint)))
.collect(Collectors.toSet());
Честно признаюсь, мне нужно было бы исследовать, можно ли также использовать Character.charCount(codePoint)
, поскольку он проверяет суррогатные пары в UTF-16, а не количество байтов в UTF-8.
Может быть полезно Character.getName(codePoint)
для замены кодовой точки (если поля имеют достаточно длинный размер).