これは本当に醜いであることが判明した.... 私はあなたの文字列をデバッグしているし、それが文字(およびその六角位置を)次のものが含まれます。
க0x0b95
ு0x0bc1
ம0x0bae
ா0x0bbe
ர0x0bb0
்0x0bcd
だから、タミル語は明らかに発音区別符号-などを使用残念ながら別のエンティティとしてカウントされるすべての文字を に取得するシーケンス。
これはUTF-8/UTF-16の問題ではありません。間違いなく という別の回答があります。これは、タミール語 の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());
結果:、yはwは、-6.0を=
ுBC1 [X = 8.0
க[7.0、H = 6.0 = W、Y、X = 0.0、= -6.0、] B95 = 5.0、h = 6.0]
∨bae[x = 17.0、y = -6.0、w = 6.0、h = 6.0]
ribe bbe [x = 23.0、y = -6.0、w = 5.0、h = 6.0]
ரのBB0のよう
[1.0、H = 2.0 = W、X = 31.0、Y = -9.0]
்BCD [X = 30.0、yは4.0、H = 8.0 = W、-6.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 str1 ="குமார் ";' – Jesper
この問題に関する論文についてはhttp://www.venkatarangan.com/blog/content/binary/Counting%20Letters%20in%20an%20Unicode%20String.pdfを参照してください。 – halex
ブログは本当に非常に有益です。しかし、それは文字列を3つの意味のある文字に分割するjavaのオプションを与えません。 – user1611248