我無法識別字符串中的替代字符,如devā́n
。正如你所看到的,這個字符串的「自然」長度(我剛剛構成表達式)是5,但是"devā́n".length()
給出了這個字符串的「自然」長度我6.
這很好,因爲ā́
內部包含兩個字符(它不是UTF-16代碼範圍)。但是我想要讀取字符串的長度或者打印出來,所以在這種情況下請使用5
。無法識別Java字符串中的替代字符
我試圖識別具有以下技巧的怪人字符發現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
謝謝,這聽起來合乎邏輯。但's = Normalizer.normalize(s,Form.NFC);'和'System.out.println(s.codePointCount(0,s.length()));'仍然給我'6'。我究竟做錯了什麼? – mumpitz
謝謝!我用's = Normalizer.normalize(s,Form.NFD);'和's = s.replaceAll(「\\ W」,「」);'測試了它,現在它的長度確實是5。 – mumpitz