【发布时间】:2017-12-31 03:25:46
【问题描述】:
我无法识别 devā́n 等字符串中的代理字符。我在 SO 上阅读了有关该主题的相关问题,但这仍然有问题...
如您所见,这个字符串的“自然”长度(我刚刚组成了那个表达式)是 5,但 "devā́n".length() 给了我 6。
这很好,因为ā́ 在内部由两个字符组成(它不属于 UTF-16 代码范围)。但我想得到字符串的长度,就像你阅读它或打印它一样,所以在这种情况下是5。
我尝试使用 here 和 here 找到的以下技巧来识别怪异字符,但它不起作用,我总是得到 6 个。看看这个:
//string containing surrogate pair
String s = "devā́n";
//prints the string properly
System.out.println("String: " + s);
//prints "Length: 6"
System.out.println("Length: " + s.length());
//prints "Codepoints: 6"
System.out.println("Codepoints: " + s.codePointCount(0, s.length()));
//false
System.out.println(
Character.isSurrogate(s.charAt(3)));
//false
System.out.println(
Character.isSurrogate(s.charAt(4)));
//six code points
System.out.println("\n");
for (int i = 0; i < s.length(); i++) {
System.out.println(s.charAt(i) + ": " + s.codePointAt(i));
}
ā́ 是否可能不是一对有效的代理字符?如何识别这样的复合字符并将其仅算作一个?
顺便说一句,上面代码的输出是
String: devā́n
Length: 6
Codepoints: 6
false
false
d: 100
e: 101
v: 118
ā: 257
́: 769
n: 110
【问题讨论】:
标签: java string character-encoding