2 回答
TA贡献1998条经验 获得超6个赞
事实上,MySQLutf8在当时是正确的,因为 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)将代码点替换为(如果字段有足够长的大小)。
TA贡献1900条经验 获得超5个赞
如果 Java 中有一种方法可以生成 -encoded 字符串的十六进制表示,则在字符串中UTF-8
搜索一个字节。F0
如果 Java 中有一种方法可以生成编码字符串的 16 位表示UTF-16
,则搜索包含D8xx-DFFF
值的任何 16 位。
(指出一些这样的方法,也许我可以详细说明。)
添加回答
举报