zoukankan      html  css  js  c++  java
  • Pinyin4j简单使用教程

    Pinyin4j是一个流行的Java库,支持中文字符和拼音之间的转换,拼音输出格式可以定制,在项目中经常会遇到需求用户输入汉字后转换为拼音的场景,这时候Pinyin4j就可以派上用场

    有自己私服的可以下载到私服,然后maven引入

    <dependency>
    	    	<groupId>net.sourceforge.pinyin4j</groupId>
         		<artifactId>pinyin4j</artifactId>
         		<version>2.5.0</version>
     		</dependency>
    

    或者自己去pinyin4j官网下载http://pinyin4j.sourceforge.net

    Pinyin4j支持方式:

    • 1.支持简体中文和繁体中文字符
    • 2.支持转换到汉语拼音,通用拼音, 威妥玛拼音(威玛拼法), 注音符号第二式, 耶鲁拼 法和国语罗马字
    • 3.支持多音字,即可以获取一个中文字符的多种发音
    • 4.支持多种字符串输出格式,比如支持Unicode格式的字符ü和声调符号(阴平 "ˉ",阳平"ˊ",上声"ˇ",去声"ˋ")的输出

    Pinyin4j支持多种格式:

    • 全部大小YHY
    • 全部大写(中间加字符串*)
    • 全部小写
    • 全部小写(中间加字符串*)
    • 返回首字母大写Y
    • 返回首字母小写y

    针对什么情况,分别给出使用方法:

    Pinyin4j pinyin4j = new Pinyin4j();
    String first1 = pinyin4j.toPinYinUppercase("测试中文");
    String first2 = pinyin4j.toPinYinUppercase("测试中文", "**");
    String first3 = pinyin4j.toPinYinLowercase("测试中文");
    String first4 = pinyin4j.toPinYinLowercase("测试中文","**");
    String first5 = pinyin4j.toPinYinUppercaseInitials("测试中文");
    String first6 = pinyin4j.toPinYinLowercaseInitials("测试中文");
    
    

    然后给出封装的工具类java代码:

    
    import java.util.HashSet;
    import java.util.Set;
    import net.sourceforge.pinyin4j.PinyinHelper;
    import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
    import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
    import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
    import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
    import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;
    
    public class Pinyin4jUtil {
    	
    	/**
    	 * getFirstSpellPinYin:(多音字的时候获取第一个). <br/> 
    	 * @param src  传入的拼音字符串,以逗号隔开
    	 * @param isFullSpell 是否全拼,true:全拼,false:第一个汉字全拼(其它汉字取首字母)
    	 * @return 第一个拼音
    	 */
    	public static String getFirstSpellPinYin(String src , boolean isFullSpell) {
    		String targetStr = Pinyin4jUtil.makeStringByStringSet(Pinyin4jUtil.getPinyin(src, isFullSpell));
    		String[] split = targetStr.split(",");
    		if (split.length > 1) {
    			targetStr = split[0];
    		}
    		return targetStr;
    	}
    
    	/**
    	 * makeStringByStringSet:(拼音字符串集合转换字符串(逗号分隔)). <br/> 
    	 * @param stringSet  拼音集合
    	 * @return  带逗号字符串
    	 */
    	public static String makeStringByStringSet(Set<String> stringSet) {
    		StringBuilder str = new StringBuilder();
    		int i = 0;
    		if (stringSet.size() > 0) {
    			for (String s : stringSet) {
    				if (i == stringSet.size() - 1) {
    					str.append(s);
    				} else {
    					str.append(s + ",");
    				}
    				i++;
    			}
    		}
    		return str.toString().toLowerCase();
    	}
    
    	/**
    	 * getPinyin:(获取汉字拼音). <br/> 
    	 * @param src   汉字
    	 * @param isFullPin  是否全拼,如果为true:全拼,false:首字全拼
    	 * @return
    	 */
    	public static Set<String> getPinyin(String src, boolean isFullSpell) {
    		if (src != null && !src.trim().equalsIgnoreCase("")) {
    			char[] srcChar;
    			srcChar = src.toCharArray();
    			// 汉语拼音格式输出类
    			HanyuPinyinOutputFormat hanYuPinOutputFormat = new HanyuPinyinOutputFormat();
    
    			// 输出设置,大小写,音标方式等
    			hanYuPinOutputFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
    			hanYuPinOutputFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
    			hanYuPinOutputFormat.setVCharType(HanyuPinyinVCharType.WITH_V);
    
    			String[][] temp = new String[src.length()][];
    			for (int i = 0; i < srcChar.length; i++) {
    				char c = srcChar[i];
    				if (String.valueOf(c).matches("[\u4E00-\u9FA5]+")) {//中文
    					try {
    						temp[i] = PinyinHelper.toHanyuPinyinStringArray(
    								srcChar[i], hanYuPinOutputFormat);
    						if (!isFullSpell) {
    							if (i == 0) {
    								temp[i] = temp[i];
    							} else {
    								String[] tTemps = new String[temp[i].length];
    								for (int j = 0; j < temp[i].length; j++) {
    									char t = temp[i][j].charAt(0);
    									tTemps[j] = Character.toString(t);
    								}
    								temp[i] = tTemps;
    							}
    						}
    					} catch (BadHanyuPinyinOutputFormatCombination e) {
    						e.printStackTrace();
    					}
    				} else if (((int) c >= 65 && (int) c <= 90)
    						|| ((int) c >= 97 && (int) c <= 122)) {//英文
    					temp[i] = new String[] { String.valueOf(srcChar[i]) };
    				} else {
    					temp[i] = new String[] { "" };
    				}
    			}
    			String[] pingyinArray = exchange(temp);
    			Set<String> pinyinSet = new HashSet<String>();
    			for (int i = 0; i < pingyinArray.length; i++) {
    				pinyinSet.add(pingyinArray[i]);
    			}
    			return pinyinSet;
    		}
    		return null;
    	}
    
    	/**
    	 * 递归
    	 * @param strJaggedArray
    	 * @return
    	 */
    	public static String[] exchange(String[][] strJaggedArray) {
    		String[][] temp = doExchange(strJaggedArray);
    		return temp[0];
    	}
    
    	/**
    	 * 递归
    	 * @param strJaggedArray
    	 * @return
    	 */
    	private static String[][] doExchange(String[][] strJaggedArray) {
    		int len = strJaggedArray.length;
    		if (len >= 2) {
    			int len1 = strJaggedArray[0].length;
    			int len2 = strJaggedArray[1].length;
    			int newlen = len1 * len2;
    			String[] temp = new String[newlen];
    			int Index = 0;
    			for (int i = 0; i < len1; i++) {
    				for (int j = 0; j < len2; j++) {
    					temp[Index] = strJaggedArray[0][i] + strJaggedArray[1][j];
    					Index++;
    				}
    			}
    			String[][] newArray = new String[len - 1][];
    			for (int i = 2; i < len; i++) {
    				newArray[i - 1] = strJaggedArray[i];
    			}
    			newArray[0] = temp;
    			return doExchange(newArray);
    		} else {
    			return strJaggedArray;
    		}
    	}
    	
    	
    }
    
  • 相关阅读:
    POJ 2240 Arbitrage spfa 判正环
    POJ 3259 Wormholes spfa 判负环
    POJ1680 Currency Exchange SPFA判正环
    HDU5649 DZY Loves Sorting 线段树
    HDU 5648 DZY Loves Math 暴力打表
    HDU5647 DZY Loves Connecting 树形DP
    CDOJ 1071 秋实大哥下棋 线段树
    HDU5046 Airport dancing links 重复覆盖+二分
    HDU 3335 Divisibility dancing links 重复覆盖
    FZU1686 神龙的难题 dancing links 重复覆盖
  • 原文地址:https://www.cnblogs.com/mzq123/p/11255214.html
Copyright © 2011-2022 走看看