代码之家  ›  专栏  ›  技术社区  ›  alex2k8

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

  •  15
  • alex2k8  · 技术社区  · 14 年前

    根据下面的文字,我如何将每个字符分类为 kana kanji ?

    è°èè¨

    得到这样的东西

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

    (对不起,如果我做得不对。)

    5 回复  |  直到 11 年前
        1
  •  34
  •   Evgeniy Berezovsky    11 年前

    此功能内置于 Character.UnicodeBlock

    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 是全宽字符。所以这和半形片假名属于同一类 フ 上面。请注意,整个宽度 与正常(半宽)不同 A :

    Character.UnicodeBlock.of('A') == BASIC_LATIN
    
        2
  •  14
  •   Jack    14 年前

    用一张桌子 this

    int val = (int)て;
    if (val >= 0x3040 && val <= 0x309f)
      return KATAKANA
    ..
    
        3
  •  6
  •   Community Muhammed Neswine    4 年前

    这似乎是一个有趣的用途 Guava CharMatcher

    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 班级。

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

    我想这可能比另一个版本慢一点。

        4
  •  4
  •   Peter Mortensen Leslie    12 年前

    您需要获得一个提供假名和汉字字符的单独范围的引用。据我所见,字母表和等价物通常有一个字符块。

        5
  •  -1
  •   Gaijinhunter    13 年前

    这是一个函数。它会把句子分解成一个单元格。您可能需要添加一些错误检查,以了解如何处理换行符或英文字符等,但这应该是一个好的开始。

    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