java - Java/Scala String中确定为长度为2的单个汉字

标签 java scala character-encoding

我试图从一个字符串中拆分出所有的汉字,但我遇到了一个奇怪的字符情况𥑮

scala> "𥑮"
res1: String = 𥑮

scala> res1.length
res2: Int = 2

scala> res1.getBytes
res3: Array[Byte] = Array(-16, -91, -111, -82)

scala> res1(0)
res4: Char = ?

scala> res1(1)
res5: Char = ?

它是单个字符,但 Java/Scala 将其确定为两个未知字符。通常我看到汉字在 UTF-8 中占用三个字节,但这个字符占用四个字节。

因此,我无法拆分字符串并找到这个单个字符。更糟糕的是,当使用 myString.replaceAll("[^\\p{script=Han}]", "") 踢掉所有非汉字时,𥑮的第二部分被替换了它变成了一个无效的字符串。

有什么解决办法吗?我在 Ubuntu 上使用 openjdk-8-jdk。

最佳答案

对于你应该使用的长度

string.codePointCount(0, string.length());

对于替换,最好避免基于字符的正则表达式。您可以编写一个依赖于 String#offsetByCodePoints() 的循环,并根据 String.codePointAt()Character.isIdeographic() 手动删除字符.

关于java - Java/Scala String中确定为长度为2的单个汉字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28761385/

相关文章:

mysql - Slick:返回具有自动增量 ID 的插入行

postgresql - 在 PostgreSQL 中转换重音字符?

powershell忽略来自不同进程的输出的字符转义

scala - 添加 @specialized 标签会导致 Scala 中出现 "value is not a member"错误

scala - 具有泛型隐式参数的隐式转换

c - gcc 在调用 `mbtowc()` 时如何决定宽字符集?

Java 正则表达式问题 - .*(www).* 与 (www)

java - 我如何在 Android Studio 中获得行号

java存储过程与sql存储过程

java - 使用公共(public) ipv4 地址创建 HttpServer