谁か确认上记これらのフ
要得到像这样的东西
誰 - kanji
か - kana
確 - kanji
認 - kanji
上 - kanji
記 - kanji
こ - kana
れ - kana
ら - kana
の - kana
フ - kana
(对不起,如果我做错了。)
答案 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
是全角字符。因此,这与上面的半宽片假名フ
属于同一类别。请注意,全宽A
与正常(半宽)A
不同:
Character.UnicodeBlock.of('A') == BASIC_LATIN
答案 1 :(得分:14)
使用像this一样的表来确定哪些unicode值用于片假名和汉字,然后你可以简单地将字符转换为int并检查它所属的位置,例如
int val = (int)て;
if (val >= 0x3040 && val <= 0x309f)
return KATAKANA
..
答案 2 :(得分:6)
对于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
类。
修改强>
根据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