Cela s'avère être vraiment laid.... J'ai débogué votre chaîne et elle contient les caractères suivants (et leur position hexagonale) :
க 0x0b95
ு 0x0bc1
ம 0x0bae
ா 0x0bbe
ர 0x0bb0
் 0x0bcd
Donc la langue tamoule utilise évidemment des séquences de type diacritique pour obtenir tous les caractères qui, malheureusement, sont considérés comme des entités séparées.
Ce n'est pas un problème avec UTF-8 / UTF-16 comme le prétendent erronément d'autres réponses. d'autres réponses, il est inhérent à l'encodage Unicode de la langue tamoule. tamoul.
Le normalisateur suggéré ne fonctionne pas, il semble que le tamil ait été conçu par Unicode "e". été conçu par les "experts" d'Unicode pour utiliser explicitement des combinaisons qui ne peuvent pas être normalisées. Aargh.
Ma prochaine idée est de ne pas compter caractères mais glyphes les représentations visuelles les représentations visuelles des personnages.
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());
Le résultat :
க 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]
Comme les glyphes se croisent, vous devez utiliser les fonctions de type de caractère Java comme dans l'autre solution.
SOLUTION :
J'utilise ce lien : 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;
}
Vous devez exclure les caractères de combinaison et les compter en conséquence.