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}