拼音工具类源码



**部分内容参考链接:**

chaychan



一、获取拼音的方法

public static String getPinyin(String str) {
        // 设置拼音结果的格式
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setCaseType(HanyuPinyinCaseType.UPPERCASE);// 设置为大写形式
        format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 不用加入声调

        StringBuilder sb = new StringBuilder();

        char[] charArray = str.toCharArray();

        for (int i = 0; i < charArray.length; i++) {
            char c = charArray[i];

            if (Character.isWhitespace(c)) {// 如果是空格则跳过
                continue;
            }

            if (isHanZi(c)) {// 如果是汉字
                String s = "";
                try {
                    if (i == 0){
                        //如果是第一个,则使用获取姓氏
                        s = getSurnamePinyin(String.valueOf(c));
                    }else{
                        // toHanyuPinyinStringArray 返回一个字符串数组是因为该汉字可能是多音字,此处只取第一个结果
                        s = PinyinHelper.toHanyuPinyinStringArray(c, format)[0];
                    }
                    sb.append(s);
                } catch (BadHanyuPinyinOutputFormatCombination e) {
                    e.printStackTrace();
                    sb.append(s);
                }

            } else {
                // 不是汉字
                if (i == 0) {
                    if (isEnglish(c)) {// 第一个属于字母,则返回该字母
                        return String.valueOf(c).toUpperCase(Locale.ENGLISH);
                    }
                    return "#"; // 不是的话返回#号
                }
            }
        }

        return sb.toString();
    }

主要的逻辑是,将字符串拆解成字符数组,遍历每个字符:

  1. 如果第一个是汉字,则获取调用getSurnamePinyin()方法,获取其对应的拼音,这个方法主要是对姓氏的处理;
  2. 如果第一个字符是英文,则直接返回该字符的大写;
  3. 如果第一个字符不是汉字也不是英文,则直接返回"#"号;

二、如何判断是否是汉字

public static boolean isHanZi(char c) {
        Pattern pattern = Pattern.compile("[\u4e00-\u9fa5]+");
        Matcher matcher = pattern.matcher(String.valueOf(c));
        return matcher.matches();
    }

使用正则表达式匹配,如果满足,则说明是汉字,返回true。

三、如何判断是否是英文

public static boolean isEnglish(char c) {
    return String.valueOf(c).matches("^[a-zA-Z]*");
 }

四、获取姓氏的拼音

    public static String getSurnamePinyin(CharSequence name) {
        if (name == null || name.length() == 0) return null;
        char ch = name.charAt(0);
        if (surnames.containsKey(ch)) {
            String s = surnames.get(ch);
            return s.toUpperCase(Locale.ENGLISH);
        }
        if (ch >= 0x4E00 && ch <= 0x9FA5) {
            int sp = (ch - 0x4E00) * 6;
            return pinyinTable.substring(sp, sp + 6).trim().toUpperCase(Locale.ENGLISH);
        } else {
            return String.valueOf(ch).toUpperCase(Locale.ENGLISH);
        }
    }

五、将汉字转换为全拼

public static String getPinYin(String src) {
		char[] t1 = null;
		t1 = src.toCharArray();
		// System.out.println(t1.length);
		String[] t2 ;
		// System.out.println(t2.length);
		// 设置汉字拼音输出的格式
		HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat();
		t3.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		t3.setVCharType(HanyuPinyinVCharType.WITH_V);
		String t4 = "";
		int t0 = t1.length;
		try {
			for (int i = 0; i < t0; i++) {
				// 判断是否为汉字字符
				// System.out.println(t1[i]);
				if (Character.toString(t1[i]).matches("[\u4E00-\u9FA5]+")) {
					t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3);// 将汉字的几种全拼都存到t2数组中
					t4 += t2[0];// 取出该汉字全拼的第一种读音并连接到字符串t4后
				} else {
					// 如果不是汉字字符,直接取出字符并连接到字符串t4后
					t4 += Character.toString(t1[i]);
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return t4;
	}

六、获取汉字串拼音首字母,英文字符不变

/**  
	 * 获取汉字串拼音首字母,英文字符不变  
	 * @param chinese 汉字串  
	 * @return 汉语拼音首字母  
	 */
	public static String getFirstSpell(String chinese) {
		if (chinese == null || chinese.trim().equalsIgnoreCase("")) {
			return "";
		}
		StringBuffer pybf = new StringBuffer();
		char[] arr = chinese.toCharArray();
		HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
		defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] > 128) {
				try {
					String[] temp = PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat);
					if (temp != null) {
						pybf.append(temp[0].charAt(0));
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
			} else {
				pybf.append(arr[i]);
			}
		}
		return pybf.toString().replaceAll("\W", "").trim();
	}
原文地址:https://www.cnblogs.com/aixing/p/13327547.html