咱們常常須要在程序中判斷一個字符是否爲CJK(Chinese、Japanese、Korean)語言的字符。函數
例如,在Contacts裏面程序須要判斷聯繫人姓名的所屬語言。this
今天爲你們介紹一種NameSplitter中使用的判斷字符所屬語言的方法。spa
以判斷字符是否爲中文爲例。code
首先,經過guessFullNameStyle函數來判斷字符所屬語言(使用UnicodeBlock來判斷);blog
public static int guessFullNameStyle(String name) { if (name == null) { return FullNameStyle.UNDEFINED; } int nameStyle = FullNameStyle.UNDEFINED; int length = name.length(); int offset = 0; while (offset < length) { int codePoint = Character.codePointAt(name, offset); if (Character.isLetter(codePoint)) { UnicodeBlock unicodeBlock = UnicodeBlock.of(codePoint); if (!isLatinUnicodeBlock(unicodeBlock)) { if (isCJKUnicodeBlock(unicodeBlock)) { // We don't know if this is Chinese, Japanese or Korean - // trying to figure out by looking at other characters in the name return guessCJKNameStyle(name, offset + Character.charCount(codePoint)); } if (isJapanesePhoneticUnicodeBlock(unicodeBlock)) { return FullNameStyle.JAPANESE; } if (isKoreanUnicodeBlock(unicodeBlock)) { return FullNameStyle.KOREAN; } } nameStyle = FullNameStyle.WESTERN; } offset += Character.charCount(codePoint); } return nameStyle; }
private static int guessCJKNameStyle(String name, int offset) { int length = name.length(); while (offset < length) { int codePoint = Character.codePointAt(name, offset); if (Character.isLetter(codePoint)) { UnicodeBlock unicodeBlock = UnicodeBlock.of(codePoint); if (isJapanesePhoneticUnicodeBlock(unicodeBlock)) { return FullNameStyle.JAPANESE; } if (isKoreanUnicodeBlock(unicodeBlock)) { return FullNameStyle.KOREAN; } } offset += Character.charCount(codePoint); } return FullNameStyle.CJK; }
其次,若是得到的結果是CJK,那麼咱們還要進一步判斷究竟是Chinese仍是Japanese仍是Koreanip
/** * If the supplied name style is undefined, returns a default based on the * language, otherwise returns the supplied name style itself. * * @param nameStyle See {@link FullNameStyle}. */ public static int getAdjustedFullNameStyle(int nameStyle) { String mLanguage = Locale.getDefault().getLanguage().toLowerCase(); if (nameStyle == FullNameStyle.UNDEFINED) { if (JAPANESE_LANGUAGE.equals(mLanguage)) { return FullNameStyle.JAPANESE; } else if (KOREAN_LANGUAGE.equals(mLanguage)) { return FullNameStyle.KOREAN; } else if (CHINESE_LANGUAGE.equals(mLanguage)) { return FullNameStyle.CHINESE; } else { return FullNameStyle.WESTERN; } } else if (nameStyle == FullNameStyle.CJK) { if (JAPANESE_LANGUAGE.equals(mLanguage)) { return FullNameStyle.JAPANESE; } else if (KOREAN_LANGUAGE.equals(mLanguage)) { return FullNameStyle.KOREAN; } else { return FullNameStyle.CHINESE; } } return nameStyle; }
恩,大體就是這樣。我用Eclipse寫了一個小Demo,但願能幫到你們~unicode
附源碼連接:get
http://pan.baidu.com/s/1gdorERh源碼