package com.android.contacts; import java.util.ArrayList; import com.android.internal.util.HanziToPinyin; import com.android.internal.util.HanziToPinyin.Token; import android.content.Context; import android.text.TextUtils; import android.util.Log; /** * This class is used to get the spelling string of a Chinese char or string. * * @author Gaowei * @version 1.0.0 2011-06-22 */ public class PinYin { private static final String TAG = "PinYin"; public static final int BUFFER_SIZE = 13; private static PinYin instance = new PinYin(); private HanziToPinyin han2pin = HanziToPinyin.getInstance(); public synchronized static PinYin getInstance(Context context) { return instance; } /** * //cct01:get pinyin of one string * * @param code * @return */ private String getPinyin(String code) { ArrayList<Token> tokens = han2pin.get(code); StringBuffer number_full = new StringBuffer(); for (int i = 0; i < tokens.size(); ++i) { Token token = tokens.get(i); if (token.type == Token.LATIN || token.type == Token.PINYIN) { number_full.append(token.target.toLowerCase()); } else { Log.w(TAG, "unknow type of character found!" + token.source); } } return number_full.toString(); } /** * Check the indicated char is Chinese char or not. * * @param c * : the indicated char. * @return */ public static boolean isChinese(char c) { if (c == '\u3007' || (c >= '\u4E00' && c <= '\u9FA5') || (c >= '\uF900' && c <= '\uFA2D')) { return true; } return false; } /** * Test if the specified string has a Chinese char. * * @param s * @return */ public static boolean hasChinese(String s) { if (null == s) { return false; } char[] sChar = s.toCharArray(); for (char c : sChar) { if (isChinese(c)) { return true; } } return false; } private String appendPinYin(StringBuffer sb, char ch) { if (isChinese(ch)) { String tmp = String.valueOf(ch); String str = getPinyin(tmp); if (!TextUtils.isEmpty(str)) { sb.append(str); } } else { sb.append(ch); } return sb.toString(); } private void appendPinYinAndShorPinYin(StringBuffer sbPinYin, StringBuffer sbShortPinYin, char ch) { if (isChinese(ch)) { String tmp = String.valueOf(ch); String str = getPinyin(tmp); if (!TextUtils.isEmpty(str)) { sbPinYin.append(str); sbShortPinYin.append(str.toCharArray()[0]); } } else { sbPinYin.append(ch); sbShortPinYin.append(ch); } // return sb.toString(); } /** * Get the pinyin string array of the name string. * * @param nameStr * the name string to be converted to pinyin * @return the pinyin string array */ public String[] getPinYinStringArray(String nameStr) { if (nameStr == null) { return null; } char[] nameChar = nameStr.toCharArray(); String[] strs = new String[nameChar.length]; for (int i = 0; i < nameChar.length; i++) { strs[i] = appendPinYin(new StringBuffer(), nameChar[i]); } return strs; } /** * * Get the pinyin string of the name string. * * @param nameStr * the name string to be converted to pinyin * @return the pinyin string */ public String getPinyinString(String nameStr) { if (nameStr == null) { return null; } StringBuffer sb = new StringBuffer(""); char[] nameChar = nameStr.toCharArray(); for (int i = 0; i < nameChar.length; i++) { // cct01: appendPinYin(sb, nameChar[i]); } return sb.toString(); } public String[] getPinyinAndShortPinyinString(String nameStr) { if (nameStr == null) { return null; } String[] pinyin = new String[2]; StringBuffer sbPinyin = new StringBuffer(""); StringBuffer sbShortPinyin = new StringBuffer(""); char[] nameChar = nameStr.toCharArray(); for (int i = 0; i < nameChar.length; i++) { // cct01: // appendPinYin(sb, nameChar[i]); appendPinYinAndShorPinYin(sbPinyin, sbShortPinyin, nameChar[i]); } pinyin[0] = sbPinyin.toString(); pinyin[1] = sbShortPinyin.toString(); return pinyin; } public String getPinyinString(char nameChar) { StringBuffer sb = new StringBuffer(""); //cct01: appendPinYin(sb, nameChar); return sb.toString(); } public void free() { } /** * judge that the phone number is valid or not. * * @param text * @return */ public static boolean isValidPhoneNumber(String text) { char[] sChar = text.toCharArray(); for (char c : sChar) { // “,;*#+” if ((c >= '0' && c <= '9') || c == ',' || c == ';' || c == '*' || c == '#' || c == '+' || c == '-') { continue; } else { return false; } } return true; } /** * filter invalid characters from a number. * * @param originalText * @return */ public static String filterInvalidNumbers(String originalText) { StringBuffer buffer = new StringBuffer(originalText); for (int i = 0; i < buffer.length(); i++) { char c = buffer.charAt(i); if ((c >= '0' && c <= '9') || c == ',' || c == ';' || c == '*' || c == '#' || c == '+' || c == '-') { continue; } else { buffer.deleteCharAt(i); } } return buffer.toString(); } /*public String getShortPinYinString(String nameStr) { if (nameStr == null) { return null; } StringBuffer sb = new StringBuffer(""); char[] nameChar = nameStr.toCharArray(); for (int i = 0; i < nameChar.length; i++) { appendShortPinYin(sb, nameChar[i]); } return sb.toString(); } private void appendShortPinYin(StringBuffer sb, char ch) { if (isChinese(ch)) { String tmp = String.valueOf(ch); String str = getPinyin(tmp); if (!TextUtils.isEmpty(str)) { sb.append(str.toCharArray()[0]); } } else { sb.append(ch); } }*/ }