pinyin4j汉字转拼音处理多音字的问题 您所在的位置:网站首页 pinyin4j生僻字处理 pinyin4j汉字转拼音处理多音字的问题

pinyin4j汉字转拼音处理多音字的问题

2023-09-07 05:10| 来源: 网络整理| 查看: 265

pinyin4j汉字转拼音处理多音字的问题

问题背景: 查询列表中有时候需要按照中文首字母进行排序,这时候一般需要将字段转为拼音进行排序最为稳妥。 例如:姓名按照汉字的拼音排序、省份按照拼音排序 解决方案一:直接使用mysql语句进行排序(适合简单的不复杂的可以)

在MySQL数据库中使用UTF-8的编码进行排序会出现不按照中文拼音的顺序排序 解决这个问题的方案是把编码重新设定为GBK或者GB2312 但是问题又来了,数据库重设编码实在是个大问题,显然不能这样使用convert()这个函数可以实现临时编码并且解决问题

SQL语句: 正序: select * from table_name ORDER BY CONVERT(name USING gbk); 倒序: select * from table_name ORDER BY CONVERT(name USING gb2312) desc 注意: image.png 解决方案二:使用pinyin4j这个jar将汉字转为拼音,再进行compareTo 1.PinyinDuoYinziUtil工具类 package com.highset; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; 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; /** * 类描述:多音字排序工具类 * 类名称:PinyinDuoYinziUtil.java * 创建人:jie.zhao * 创建时间:2017年10月16日 * 备注: * * @version 1.0.0 */ public class PinyinDuoYinziUtil { private static Map pinyinMap = new HashMap(); /** * 静态代码块 -->加载字典文件 */ static { try { initPinyin("dict.txt");// 这是自定义字典文件 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } /** * Description:主程序 * @param args * @throws FileNotFoundException * @throws UnsupportedEncodingException * @Note * Author:Jie.Zhao * Date: 2017年12月1日 下午5:21:10 * Version: 1.0 */ public static void main(String[] args) throws FileNotFoundException, UnsupportedEncodingException { List list = new ArrayList(); list.add("浙江"); list.add("北京"); list.add("重庆"); list.add("云南"); list.add("和"); list.add("天津"); System.out.println("排序前:"+list); Collections.sort(list, new Comparator() { public int compare(String o1, String o2) { return getPinYin(o1).compareTo(getPinYin(o2)); } }); System.out.println("排序后:"+list); } /** * Description: 这是核心方法 * @param chinese * @return * @Note * Author:Jie.Zhao * Date: 2017年12月1日 下午5:22:05 * Version: 1.0 */ public static String getPinYin(String chinese) { char[] arr = null; arr = chinese.toCharArray(); String[] results = new String[arr.length]; HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); format.setCaseType(HanyuPinyinCaseType.LOWERCASE); format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); format.setVCharType(HanyuPinyinVCharType.WITH_V); StringBuffer pinyin = new StringBuffer(); String result = ""; try { for (int i = 0; i < arr.length; i++) { char ch = arr[i]; // 判断是否为汉字字符 if (java.lang.Character.toString(ch).matches("[\\u4E00-\\u9FA5]+")) { results = net.sourceforge.pinyin4j.PinyinHelper.toHanyuPinyinStringArray(ch, format); int len = results.length; if (len == 1) { // 不是多音字 result = results[0]; } else if (results[0].equals(results[1])) {// 非多音字 有多个音,取第一个 result = results[0]; } else { // 多音字 int length = chinese.length(); boolean flag = false; String s = null; List keyList = null; for (int x = 0; x < len; x++) { String py = results[x]; if (py.contains("u:")) { // 过滤 u: py = py.replace("u:", "v"); // System.out.println("filter u:" + py); } keyList = pinyinMap.get(py); if (i + 3 = 0) && (i + 1 = 0) && (i + 1 = 0) && (i + 2


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有