单个中文字符在Java/Scala字符串中确定为长度2

pis*_*hen 11 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 = ?
Run Code Online (Sandbox Code Playgroud)

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

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

这有什么解决方案吗?我在Ubuntu上使用openjdk-8-jdk.

Mar*_*nik 8

你应该使用长度

string.codePointCount(0, string.length());
Run Code Online (Sandbox Code Playgroud)

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