这原来是真的丑 .... 我已经调试您的字符串,它包含以下字符(和它们的十六进制位置):
க0x0b95
ு0x0bc1
ம0x0bae
ா0x0bbe
ர0x0bb0
்0x0bcd
所以泰米尔语显然使用变音符号般的序列得到 所有字符,不幸算作单独的实体。
这不是UTF-8/UTF-16的问题,如 其他答案所声称的,它是泰米尔 语言的Unicode编码中固有的。
建议的Normalizer不起作用,似乎泰米尔有 已由Unicode“专家”设计明确使用不能正常化的组合 序列。 AARGH。
我的下一个想法是不指望字符,但字形,人物的视觉 表示。
String str1 = new String(Normalizer.normalize("குமார்", Normalizer.Form.NFC));
Font display = new Font("SansSerif",Font.PLAIN,12);
GlyphVector vec = display.createGlyphVector(new FontRenderContext(new AffineTransform(),false, false),str1);
System.out.println(vec.getNumGlyphs());
for (int i=0; i<str1.length(); i++)
System.out.printf("%s %s %s %n",str1.charAt(i),Integer.toHexString((int) str1.charAt(i)),vec.getGlyphVisualBounds(i).getBounds2D().toString());
其结果是:
கB95 [X = 0.0,Y = -6.0,W = 7.0,H = 6.0]
ுBC1 [X = 8.0,Y = -6.0,W = 7.0,h = 4.0]
மbae [x = 17.0,y = -6.0,w = 6.0,h = 6.0]
bbe [x = 23.0,y = -6.0,w = 5.0,h = 6.0]
ரBB0 [X = 30.0,Y = -6.0,W = 4.0,H = 8.0]
்BCD [X = 31.0,Y = -9.0,W = 1.0,H = 2.0]
作为GL yphs正在相交,您需要使用Java字符类型 函数,就像在其他解决方案中一样。
SOLUTION:
我使用这个链接:http://www.venkatarangan.com/blog/content/binary/Counting%20Letters%20in%20an%20Unicode%20String.pdf
public static int getTamilStringLength(String tamil) {
int dependentCharacterLength = 0;
for (int index = 0; index < tamil.length(); index++) {
char code = tamil.charAt(index);
if (code == 0xB82)
dependentCharacterLength++;
else if (code >= 0x0BBE && code <= 0x0BC8)
dependentCharacterLength++;
else if (code >= 0x0BCA && code <= 0x0BD7)
dependentCharacterLength++;
}
return tamil.length() - dependentCharacterLength;
}
你需要排除的组合字符,并相应地计数。
它没有任何区别的问题,但有没有必要使用'新的String(“...”)'只是:'String str1 =“குமார்”;' – Jesper 2013-04-11 11:52:32
有关此问题的论文,请参见http://www.venkatarangan.com/blog/content/binary/Counting%20Letters%20in%20an%20Unicode%20String.pdf。 – halex 2013-04-11 11:55:15
博客真的非常丰富。但是它并没有给我们一个java选项来将字符串分成三个有意义的字符。 – user1611248 2013-04-11 12:11:19