**部分内容参考链接:**
一、获取拼音的方法
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();
}
主要的逻辑是,将字符串拆解成字符数组,遍历每个字符:
- 如果第一个是汉字,则获取调用getSurnamePinyin()方法,获取其对应的拼音,这个方法主要是对姓氏的处理;
- 如果第一个字符是英文,则直接返回该字符的大写;
- 如果第一个字符不是汉字也不是英文,则直接返回"#"号;
二、如何判断是否是汉字
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();
}