001package top.cenze.utils; 002 003import cn.hutool.core.util.StrUtil; 004import net.sourceforge.pinyin4j.PinyinHelper; 005import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; 006import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; 007import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; 008import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType; 009import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; 010 011/** 012 * 取得给定汉字串的首字母串,即声母串 013 * Title: ChineseCharToEn 014 * @date 2004-02-19 注:只支持GB2312字符集中的汉字 015 */ 016public final class PinyinUtil { 017 /** 汉语拼音格式化工具类 */ 018 private static HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); 019 020 021 /** 022 * 获取字符串内的所有汉字的汉语拼音 023 * @param src 024 * @return 025 */ 026 public static String spell(String src) { 027 format.setCaseType(HanyuPinyinCaseType.LOWERCASE); // 小写拼音字母 028 format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); // 不加语调标识 029 format.setVCharType(HanyuPinyinVCharType.WITH_V); // u:的声母替换为v 030 031 StringBuffer sb = new StringBuffer(); 032 int strLength = src.length(); 033 try { 034 for (int i = 0; i < strLength; i++) { 035 // 对英文字母的处理:小写字母转换为大写,大写的直接返回 036 char ch = src.charAt(i); 037 if (ch >= 'a' && ch <= 'z') 038 sb.append((char) (ch - 'a' + 'A')); 039 if (ch >= 'A' && ch <= 'Z') 040 sb.append(ch); 041 // 对汉语的处理 042 String[] arr = PinyinHelper.toHanyuPinyinStringArray(ch, format); 043 if (arr != null && arr.length > 0) 044 sb.append(arr[0]).append(" "); 045 } 046 } catch (BadHanyuPinyinOutputFormatCombination e) { 047 e.printStackTrace(); 048 } 049 return sb.toString(); 050 } 051 052 /** 053 * 获取字符串内的所有汉字的汉语拼音并大写每个字的首字母 054 * @param src 055 * @return 056 */ 057 public static String spellWithTone(String src) { 058 format.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 小写 059 format.setToneType(HanyuPinyinToneType.WITH_TONE_MARK);// 标声调 060 format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE);// u:的声母 061 062 if (src == null) { 063 return null; 064 } 065 try { 066 StringBuilder sb = new StringBuilder(); 067 for (int i = 0; i < src.length(); i++) { 068 // 对英文字母的处理:小写字母转换为大写,大写的直接返回 069 char ch = src.charAt(i); 070 if (ch >= 'a' && ch <= 'z') 071 sb.append((char) (ch - 'a' + 'A')); 072 if (ch >= 'A' && ch <= 'Z') 073 sb.append(ch); 074 // 对汉语的处理 075 String[] arr = PinyinHelper.toHanyuPinyinStringArray(ch, format); 076 if (arr == null || arr.length == 0) { 077 continue; 078 } 079 String s = arr[0];// 不管多音字,只取第一个 080 char c = s.charAt(0);// 大写第一个字母 081 String pinyin = String.valueOf(c).toUpperCase().concat(s.substring(1)); 082 sb.append(pinyin).append(" "); 083 } 084 return sb.toString(); 085 } catch (BadHanyuPinyinOutputFormatCombination e) { 086 e.printStackTrace(); 087 } 088 return null; 089 } 090 091 /** 092 * 获取字符串内的所有汉字的汉语拼音并大写每个字的首字母 093 * @param src 094 * @return 095 */ 096 public static String spellNoneTone(String src) { 097 // 小写 098 format.setCaseType(HanyuPinyinCaseType.LOWERCASE); 099 // 标声调 100 format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); 101 // u:的声母 102 format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE); 103 104 if (src == null) { 105 return null; 106 } 107 try { 108 StringBuilder sb = new StringBuilder(); 109 for (int i = 0; i < src.length(); i++) { 110 //对英文字母的处理:小写字母转换为大写,大写的直接返回 111 char ch = src.charAt(i); 112 if (ch >= 'a' && ch <= 'z') 113 sb.append((char) (ch - 'a' + 'A')); 114 if (ch >= 'A' && ch <= 'Z') 115 sb.append(ch); 116 // 对汉语的处理 117 String[] arr = PinyinHelper.toHanyuPinyinStringArray(ch, format); 118 if (arr == null || arr.length == 0) { 119 continue; 120 } 121 // 不管多音字,只取第一个 122 String s = arr[0]; 123 // 大写第一个字母 124 char c = s.charAt(0); 125 //全拼 126 //String pinyin = String.valueOf(c).toUpperCase().concat(s.substring(1)); 127 //首拼 128 String pinyin = String.valueOf(c).toUpperCase(); 129 sb.append(pinyin).append(""); 130 } 131 return sb.toString(); 132 } catch (BadHanyuPinyinOutputFormatCombination e) { 133 e.printStackTrace(); 134 } 135 return null; 136 } 137 138 /** 139 * 获取汉语第一个字的首英文字母 140 * @param src 141 * @return 142 */ 143 public static String getTerm(String src){ 144 String res = spell(src); 145 if(res!=null&&res.length()>0){ 146 return res.toUpperCase().charAt(0)+""; 147 }else{ 148 return "OT"; 149 } 150 } 151 152 /** 153 * 中文转拼音(非中文原样返回) 154 * @param inputString 155 * @return 156 */ 157 public static String toPinYin(String inputString) { 158// log.info("getPinYin: {}", inputString); 159 if (StrUtil.isEmpty(inputString)) { 160 return null; 161 } 162 163 HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); 164 format.setCaseType(HanyuPinyinCaseType.LOWERCASE); 165 format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); 166 format.setVCharType(HanyuPinyinVCharType.WITH_U_UNICODE); 167 168 char[] input = inputString.trim().toCharArray(); 169 StringBuffer output = new StringBuffer(""); 170 171 try { 172 for (int i = 0; i < input.length; i++) { 173 if (Character.toString(input[i]).matches("[\\u4E00-\\u9FA5]+")) { 174 String[] temp = PinyinHelper.toHanyuPinyinStringArray(input[i], format); 175 output.append(temp[0]); 176 } else { 177 output.append(Character.toString(input[i])); 178 } 179 } 180 } catch (BadHanyuPinyinOutputFormatCombination e) { 181 e.printStackTrace(); 182 } 183 184 return output.toString(); 185// log.info("getPinYin to: {}", out); 186 } 187 188// public static void main(String[] args) { 189// System.out.println(spellWithTone("中华人民共和国")); 190// System.out.println(spell("中华人民共和国")); 191// System.out.println(spellNoneTone("中华人民共和国")); 192// System.out.println(getTerm("中华人民共和国")); 193// 194// String code = spellNoneTone("中华人"); 195// 196// int num = 5 - code.length(); 197// System.out.println(String.format("%s%0"+ num +"d",code,0)); 198// code = code.substring(code.length() - 1,code.length()); 199// System.out.println(code); 200// 201// code = "CSZZJ01"; 202// int n = Integer.parseInt(code.substring(code.length() - 2,code.length())); 203// n++; 204// code = String.format("%s%02d", code.substring(0,code.length() - 2),n); 205// 206// System.out.println(code); 207// } 208 209}