这真的很丑陋...我已经调试了你的字符串并发现以下字符(以及它们的十六进制位置):
க 0x0b95
ு 0x0bc1
ம 0x0bae
ா 0x0bbe
ர 0x0bb0
் 0x0bcd
因此,泰米尔语使用类似变音符号的序列来获得所有字符,而这些字符不幸地被计算为单独的实体。
这不是UTF-8 / UTF-16的问题,尽管其他答案错误地声称是这样,而是Unicode编码泰米尔语中固有的问题。
所建议的正常化程序不起作用,似乎泰米尔语已被Unicode "专家"明确设计为使用不能规范化的组合序列。 真恼火。
我的下一个想法是不要计算字符,而是计算字形,即字符的视觉表示。
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]
由于字形相交,您需要使用Java字符类型函数,就像其他解决方案一样。
解决方案:
我正在使用此链接: 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;
}
您需要排除组合字符并相应地计数。
new String("...")
пјҢеҸӘйңҖиҰҒиҝҷж ·еҒҡпјҡString str1 = "а®•аҜҒа®®а®ҫа®°аҜҚ";
гҖӮ - Jesper