最近接到需求,要求商城中进行半模糊搜索时,输入拼音字母同样要求进行自动匹配出相关品牌、类目、关键词等数据,从而进行筛选商品
本片内容只记录汉字转换拼音
方案一:在mysql数据库中编写函数,此方法存在两个弊端
弊端1. 现在很多公司编码设计规范中不允许使用函数、存储过程、视图等,在现在的互联网时代经常会因为项目的需要进行分库分表或数据库迁移拆分等,使用这些容易出现问题,且存储过程等难以追查和维护
弊端2. 在数据库中存在很多意想不到的字符,只凭借函数过滤会造成大量代码的编写,难度过高,本人在此次任务需求中在处理历史数据时首先使用的就是编写函数的方式进行更新,在生成品牌名称拼音的过程中就遇到了这个问题,其中包括但不限于希腊字母、越南字母。
方案二:在java中拼音转换方法如下
mavn项目pom文件中引入包

<dependency>
	<groupId>org.iherus</groupId>
	<artifactId>qrext4j</artifactId>
	<version>1.3.1</version>
</dependency>
<dependency>
	<groupId>com.belerweb</groupId>
	<artifactId>pinyin4j</artifactId>
	<version>2.5.0</version>
</dependency>

代码部分

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 PinyinUtils {
    /**
     * 将汉字转换为全拼
     * @param src
     * @return String
     */
    public static String getPinYin(String src) {
        char[] t1 = null;
        t1 = src.toCharArray();
        String[] t2 = new String[t1.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++) {
                // 判断是否为汉字字符
                if (Character.toString(t1[i]).matches("[\\u4E00-\\u9FA5]+")) {
                    t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3);// 将汉字的几种全拼都存到t2数组中
                    if (t2 != null){//此处添加判断,因为个别汉字转换拼音时出现异常,转换失败
                        t4 += t2[0];// 取出该汉字全拼的第一种读音并连接到字符串t4后
                    }else{
						throw new BusinessException("转换拼音异常汉字:"+t1[i]);
					}
                } else {
                    // 如果不是汉字字符,直接取出字符并连接到字符串t4后
                    t4 += Character.toString(t1[i]);
                }
            }
        } catch (BadHanyuPinyinOutputFormatCombination e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return t4;
    }

    /**
     * 提取每个汉字的首字母
     *
     * @param str
     * @return String
     */
    public static String getPinYinHeadChar(String str) {
        String convert = "";
        for (int j = 0; j < str.length(); j++) {
            char word = str.charAt(j);
            // 提取汉字的首字母
            String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(word);
            if (pinyinArray != null) {
                convert += pinyinArray[0].charAt(0);
            } else {
                convert += word;
            }
        }
        return convert;
    }

    /**
     * 将字符串转换成ASCII码
     *
     * @param cnStr
     * @return String
     */
    public static String getCnASCII(String cnStr) {
        StringBuffer strBuf = new StringBuffer();
        // 将字符串转换成字节序列
        byte[] bGBK = cnStr.getBytes();
        for (int i = 0; i < bGBK.length; i++) {
            // 将每个字符转换成ASCII码
            strBuf.append(Integer.toHexString(bGBK[i] & 0xff) + " ");
        }
        return strBuf.toString();
    }
}

根据自己的需要进行方法的选择即可
注意:个别汉字转换时,出现异常,PinyinHelper.toHanyuPinyinStringArray() 方法返回Array reference expected,本文在此处处理时是对不能转换为拼音的汉字给与提示,以免影响后续查询精度,读者可根据自己的需要进行提示、直接抛出异常、过滤忽略。汉字不能正常转换的在本次任务中发现两个: 婔、嚒