Questo mi sembra sarebbe un uso interessante per la classe GuavaCharMatcher. Usando le tabelle collegate in risposta di Jack, ho creato questo:
public class JapaneseCharMatchers {
public static final CharMatcher HIRAGANA =
CharMatcher.inRange((char) 0x3040, (char) 0x309f);
public static final CharMatcher KATAKANA =
CharMatcher.inRange((char) 0x30a0, (char) 0x30ff);
public static final CharMatcher KANA = HIRAGANA.or(KATAKANA);
public static final CharMatcher KANJI =
CharMatcher.inRange((char) 0x4e00, (char) 0x9faf);
public static void main(String[] args) {
test("誰か確認上記これらのフ");
}
private static void test(String string) {
System.out.println(string);
System.out.println("Hiragana: " + HIRAGANA.retainFrom(string));
System.out.println("Katakana: " + KATAKANA.retainFrom(string));
System.out.println("Kana: " + KANA.retainFrom(string));
System.out.println("Kanji: " + KANJI.retainFrom(string));
}
}
L'esecuzione di questo stampa il previsto:
誰 か 確認 上 記 こ れ ら の フ
Hiragana: か こ れ ら の
Katakana: 2
Kana: か こ れ ら の
Kanji: 誰 確認 上 記
Questo ti dà un sacco di potenza per lavorare con il testo giapponese, definendo le regole per determinare se un personaggio si trova in uno di questi gruppi in un oggetto che non può che fare un molte cose utili in sé, ma possono anche essere usate con altre API come la classe di Guava.
Edit:
in base alla risposta del jleedev, si potrebbe anche scrivere un metodo come:
public static CharMatcher inUnicodeBlock(final Character.UnicodeBlock block) {
return new CharMatcher() {
public boolean matches(char c) {
return Character.UnicodeBlock.of(c) == block;
}
};
}
e usarlo come:
CharMatcher HIRAGANA = inUnicodeBlock(Character.UnicodeBlock.HIRAGANA);
Penso che questo potrebbe essere un un po 'più lento rispetto all'altra versione.
Cosa intendi esattamente per "divisione"? – Crag
Domanda aggiornata per rendere l'obiettivo più chiaro. – alex2k8
I geroglifici sono un'antica forma di testo egiziano. Non hanno nulla a che fare con le moderne forme di testo giapponesi. –