2010-09-30 19 views
15

Dato il seguente testo, come classificare ciascun carattere come kana o kanji?Come classificare i caratteri giapponesi come kanji o kana?

誰 か 確認 上 記 こ れ ら の フ

Per ottenere qualche cosa come questa

誰 - kanji 
か - kana 
確 - kanji 
認 - kanji 
上 - kanji 
記 - kanji 
こ - kana 
れ - kana 
ら - kana 
の - kana 
フ - kana 

(Scusate se ho fatto in modo non corretto.)

+2

Cosa intendi esattamente per "divisione"? – Crag

+0

Domanda aggiornata per rendere l'obiettivo più chiaro. – alex2k8

+2

I geroglifici sono un'antica forma di testo egiziano. Non hanno nulla a che fare con le moderne forme di testo giapponesi. –

risposta

33

Questa funzionalità è incorporata nella classe Character.UnicodeBlock. Alcuni esempi dei blocchi Unicode legati alla lingua giapponese:

Character.UnicodeBlock.of('誰') == CJK_UNIFIED_IDEOGRAPHS 
Character.UnicodeBlock.of('か') == HIRAGANA 
Character.UnicodeBlock.of('フ') == KATAKANA 
Character.UnicodeBlock.of('フ') == HALFWIDTH_AND_FULLWIDTH_FORMS 
Character.UnicodeBlock.of('!') == HALFWIDTH_AND_FULLWIDTH_FORMS 
Character.UnicodeBlock.of('。') == CJK_SYMBOLS_AND_PUNCTUATION 

Ma, come sempre, il diavolo è nei dettagli:

Character.UnicodeBlock.of('A') == HALFWIDTH_AND_FULLWIDTH_FORMS 

dove è il carattere a tutta larghezza.Quindi questo è nella stessa categoria della mezza larghezza Katakana sopra. Si noti che il full-width è diverso dal normale (metà larghezza) A:

Character.UnicodeBlock.of('A') == BASIC_LATIN 
+0

Interessante, non lo sapevo. – ColinD

+0

ma CJK_UNIFIED_IDEOGRAPHS non viene trovato come predefinito, presumo che sia necessaria un'ulteriore istruzione di importazione, oltre a quella necessaria per Carattere. – Noah

+0

Non sapevo nemmeno che fosse una funzione! Grazie! –

4

È necessario ottenere un riferimento che dà la distinta intervalli per caratteri kana e kanji. Da quello che ho visto, alfabeti e equivalenti di solito ottengono un blocco di caratteri.

+1

Bene, in Unicode Kanji ha un intervallo da U + 4E00 a U + 9FBF, Katakana ha un intervallo da U + 30A0 a U + 30FF e Hiragana ha un intervallo da U + 3040 a U + 309F. Con questo testo 'split' dovrebbe essere facile, a seconda di cosa sia effettivamente la divisione. – Crag

+0

Non è così facile come sembra, perché ci sono più intervalli per ciascuno. – Noah

14

utilizzare una tabella come this uno per determinare quali valori Unicode vengono utilizzati per katakana e kanji, allora si può semplicemente lanciare il carattere a un int e verificare in cui essa appartiene, qualcosa come

int val = (int)て; 
if (val >= 0x3040 && val <= 0x309f) 
    return KATAKANA 
.. 
+1

+1 - Bel tavolo! – BrunoLM

+1

Si noti che jleedev ha essenzialmente lo stesso metodo, ma utilizza una tabella fornita dalla JVM. – MSalters

6

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.

+0

Giusto, se vuoi solo testare l'appartenenza a un intervallo specifico, potrebbe essere più veloce farlo da solo. Sorprendentemente, la classe UnicodeBlock non ha un metodo per testare un carattere per l'appartenenza, e sembra che l'unico modo sia il suo metodo 'of' statico, che scorre in ogni blocco finché non ne trova uno. –

0

So che non hai chiesto per VBA, ma qui è il sapore VBA per chi vuole sapere:

Ecco una funzione che lo farà. Abbatterà la frase come hai sopra in una singola cella. Potrebbe essere necessario aggiungere un controllo degli errori per capire come si desidera gestire interruzioni di riga o caratteri inglesi, ecc. Ma questo dovrebbe essere un buon inizio.

Function KanjiKanaBreakdown(ByVal text As String) As String 

Application.ScreenUpdating = False 
Dim kanjiCode As Long 
Dim result As String 
Dim i As Long 

For i = 1 To Len(text) 
    If Asc(Mid$(text, i, 1)) > -30562 And Asc(Mid$(text, i, 1)) < -950 Then 
     result = (result & (Mid$(text, i, 1)) & (" - kanji") & vbLf) 
    Else 
     result = (result & (Mid$(text, i, 1)) & (" - kana") & vbLf) 
    End If 
Next 

KanjiKanaBreakdown = result 
Application.ScreenUpdating = True 

End Function 
Problemi correlati