如何将日文字符分类为汉字或假名?

时间:2010-09-30 00:37:49

标签: java unicode cjk

鉴于以下文字,我如何将每个字符分类为kanakanji

谁か确认上记これらのフ

要得到像这样的东西

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

(对不起,如果我做错了。)

5 个答案:

答案 0 :(得分:33)

此功能内置于Character.UnicodeBlock类中。与日语相关的Unicode块的一些示例:

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

但是,与往常一样,魔鬼在细节中:

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

其中是全角字符。因此,这与上面的半宽片假名属于同一类别。请注意,全宽与正常(半宽)A不同:

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

答案 1 :(得分:14)

使用像this一样的表来确定哪些unicode值用于片假名和汉字,然后你可以简单地将字符转换为int并检查它所属的位置,例如

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

答案 2 :(得分:6)

对于GuavaCharMatcher课程来说,这似乎是一个有趣的用法。使用杰克答案中链接的表格,我创建了这个:

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));
  }
}

运行此打印预期的:

  

谁か确认上记これらのフ

     

平假名:かこれらの

     

片假名:フ

     

假名:かこれらのフ

     汉堡:谁确认上记

通过定义用于确定某个字符是否在某个对象中的某个组中的规则,这不仅可以自行执行许多有用的操作,而且还可以使用,这为您提供了处理日文文本的强大功能与其他API,如Guava的Splitter类。

修改

根据jleedev的回答,您还可以编写如下方法:

public static CharMatcher inUnicodeBlock(final Character.UnicodeBlock block) {
  return new CharMatcher() {
    public boolean matches(char c) {
      return Character.UnicodeBlock.of(c) == block;
    }
  };
}

并使用它:

CharMatcher HIRAGANA = inUnicodeBlock(Character.UnicodeBlock.HIRAGANA);

我认为这可能比其他版本慢一点。

答案 3 :(得分:4)

您需要获取一个引用,该引用为假名和汉字字符提供单独的范围。从我所看到的,字母和等价物通常会得到一个字符块。

答案 4 :(得分:0)

我知道你没有要求VBA,但对于那些想知道的人来说,VBA的味道是:

这是一个可以做到的功能。它会将您上面的句子分解为单个单元格。您可能需要添加一些错误检查,以确定如何处理换行符或英文字符等,但这应该是一个良好的开端。

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