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

ale*_*2k8 15 java unicode cjk

鉴于下面的文字,我如何将每个角色分类为假名汉字

谁か确认上记これらのフ

得到这样的东西

? - kanji
? - kana
? - kanji
? - kanji 
? - kanji 
? - kanji 
? - kana 
? - kana
? - kana
? - kana
? - kana
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*Lee 34

此功能内置于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
Run Code Online (Sandbox Code Playgroud)

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

Character.UnicodeBlock.of('?') == HALFWIDTH_AND_FULLWIDTH_FORMS
Run Code Online (Sandbox Code Playgroud)

?全角字符在哪里.因此,这与?上面的半宽片假名属于同一类别.请注意,全宽度?与正常宽度(半宽度)不同A:

Character.UnicodeBlock.of('A') == BASIC_LATIN
Run Code Online (Sandbox Code Playgroud)


Jac*_*ack 14

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

int val = (int)?;
if (val >= 0x3040 && val <= 0x309f)
  return KATAKANA
..
Run Code Online (Sandbox Code Playgroud)


Col*_*inD 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));
  }
}
Run Code Online (Sandbox Code Playgroud)

运行此打印预期:

谁か确认上记これらのフ

平假名:かこれらの

片假名:フ

假名:かこれらのフ

汉字:谁确认上记

通过定义用于确定某个字符是否属于某个对象的其中一个组中的规则,这可以为您提供处理日语文本的强大功能,该对象本身不仅可以执行许多有用的操作,还可以与其他API一起使用比如番石榴的Splitter班级.

编辑:

基于jleedev的答案,您还可以编写如下方法:

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

并使用它像:

CharMatcher HIRAGANA = inUnicodeBlock(Character.UnicodeBlock.HIRAGANA);
Run Code Online (Sandbox Code Playgroud)

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