1、本文使用pinyin4j.jar包生成汉字的拼音,遇到多音字用此jar包会生成多个拼音,怎样的到最准确的那个拼音比如(长大:zhangda 而不是changda)

需要读取pinyin.txt文件进行过滤;

代码如下:

package pingyin;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.exception.BadHanyuPinyinOutputFormatCombination;

public class TMP {
private static Map<String, List<String>> pinyinMap = new HashMap<String, List<String>>();  
   private static long count = 0;  
 
   public static void main(String[] args) {  
 
       String str ="";  
//      String str = "中国人民银行";  
         
       initPinyin("./pinyin.txt");  
         
       String py = convertChineseToPinyin(str);  
       System.out.println(str+" = "+py);  
 
   }  
     
   /** 
    * 将某个字符串的首字母 大写 
    * @param str 
    * @return 
    */  
   public static String convertInitialToUpperCase(String str){  
       if(str==null){  
           return null;  
       }  
       StringBuffer sb = new StringBuffer();  
       char[] arr = str.toCharArray();  
       for(int i=0;i<arr.length;i++){  
           char ch = arr[i];  
           if(i==0){  
               sb.append(String.valueOf(ch).toUpperCase());  
           }else{  
               sb.append(ch);  
           }  
       }  
         
       return sb.toString();  
   }  
 
   /** 
    * 汉字转拼音 最大匹配优先 
    * @param chinese 
    * @return 
    */  
   private static String convertChineseToPinyin(String chinese) {  
 
       StringBuffer pinyin = new StringBuffer();  
 
       HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();  
       defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);  
       defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);  
 
       char[] arr = chinese.toCharArray();  
 
       for (int i = 0; i < arr.length; i++) {  
 
           char ch = arr[i];  
 
           if (ch > 128) { // 非ASCII码  
               // 取得当前汉字的所有全拼  
               try {  
 
                   String[] results = PinyinHelper.toHanyuPinyinStringArray(  
                           ch, defaultFormat);  
 
                   if (results == null) {  //非中文  
 
                       return "";  
                   } else {  
 
                       int len = results.length;  
 
                       if (len == 1) { // 不是多音字  
 
//                          pinyin.append(results[0]);  
                           String py = results[0];       
                           if(py.contains("u:")){  //过滤 u:  
                               py = py.replace("u:", "v");  
                               System.out.println("filter u:"+py);  
                           }  
                           pinyin.append(convertInitialToUpperCase(py));  
                             
                       }else if(results[0].equals(results[1])){    //非多音字 有多个音,取第一个  
                             
//                          pinyin.append(results[0]);  
                           pinyin.append(convertInitialToUpperCase(results[0]));  
                             
                       }else { // 多音字  
                             
                           System.out.println("多音字:"+ch);  
                             
                           int length = chinese.length();  
                             
                           boolean flag = false;  
                             
                           String s = null;  
                             
                           List<String> 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 <= length) {   //后向匹配2个汉字  大西洋   
                                   s = chinese.substring(i, i + 3);  
                                   if (keyList != null && (keyList.contains(s))) {  
//                                  if (value != null && value.contains(s)) {  
 
                                       System.out.println("last 2 > " + py);  
//                                      pinyin.append(results[x]);  
                                       pinyin.append(convertInitialToUpperCase(py));  
                                       flag = true;  
                                       break;  
                                   }  
                               }  
                                 
                               if (i + 2 <= length) {   //后向匹配 1个汉字  大西  
                                   s = chinese.substring(i, i + 2);  
                                   if (keyList != null && (keyList.contains(s))) {  
 
                                       System.out.println("last 1 > " + py);  
//                                      pinyin.append(results[x]);  
                                       pinyin.append(convertInitialToUpperCase(py));  
                                       flag = true;  
                                       break;  
                                   }  
                               }  
                                 
                               if ((i - 2 >= 0) && (i+1<=length)) {  // 前向匹配2个汉字 龙固大  
                                   s = chinese.substring(i - 2, i+1);  
                                   if (keyList != null && (keyList.contains(s))) {  
                                         
                                       System.out.println("before 2 < " + py);  
//                                      pinyin.append(results[x]);  
                                       pinyin.append(convertInitialToUpperCase(py));  
                                       flag = true;  
                                       break;  
                                   }  
                               }  
                                 
                               if ((i - 1 >= 0) && (i+1<=length)) {  // 前向匹配1个汉字   固大  
                                   s = chinese.substring(i - 1, i+1);  
                                   if (keyList != null && (keyList.contains(s))) {  
                                         
                                       System.out.println("before 1 < " + py);  
//                                      pinyin.append(results[x]);  
                                       pinyin.append(convertInitialToUpperCase(py));  
                                       flag = true;  
                                       break;  
                                   }  
                               }  
                                 
                               if ((i - 1 >= 0) && (i+2<=length)) {  //前向1个,后向1个      固大西  
                                   s = chinese.substring(i - 1, i+2);  
                                   if (keyList != null && (keyList.contains(s))) {  
                                         
                                       System.out.println("before last 1 <> " + py);  
//                                      pinyin.append(results[x]);  
                                       pinyin.append(convertInitialToUpperCase(py));  
                                       flag = true;  
                                       break;  
                                   }  
                               }  
                           }  
                             
                           if (!flag) {    //都没有找到,匹配默认的 读音  大   
                                 
                               s = String.valueOf(ch);  
                                 
                               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:");  
                                   }  
                                     
                                   keyList = pinyinMap.get(py);  
                                     
                                   if (keyList != null && (keyList.contains(s))) {  
                                         
                                       System.out.println("default = " + py);  
//                                      pinyin.append(results[x]);  //如果不需要拼音首字母大写 ,直接返回即可  
                                       pinyin.append(convertInitialToUpperCase(py));//拼音首字母 大写  
                                       break;  
                                   }  
                               }  
                           }  
                       }  
                   }  
 
               } catch (BadHanyuPinyinOutputFormatCombination e) {  
                   e.printStackTrace();  
               }  
           } else {  
               pinyin.append(arr[i]);  
           }  
       }  
       return pinyin.toString();  
   }  
 
   /** 
    * 初始化 所有的多音字词组 
    *  
   
    * @param fileName 
    */  
   public static void initPinyin(String fileName) {  
       // 读取多音字的全部拼音表;
   
       InputStream file = TMP.class.getResourceAsStream("pinyin.txt"); 
 
       BufferedReader br = new BufferedReader(new InputStreamReader(file));  
 
       String s = null;  
       try {  
           while ((s = br.readLine()) != null) {  
 
               if (s != null) {  
                   String[] arr = s.split("#");  
                   String pinyin = arr[0];  
                   String chinese = arr[1];  
 
                   if(chinese!=null){  
                       String[] strs = chinese.split(" ");  
                       List<String> list = Arrays.asList(strs);  
                       pinyinMap.put(pinyin, list);  
                   }  
               }  
           }  
 
       } catch (IOException e) {  
           e.printStackTrace();  
       }finally{  
           try {  
               br.close();  
           } catch (IOException e) {  
               e.printStackTrace();  
           }  
       }  
   }  
}

java拼音汉字转换相关推荐

  1. java版汉字转换拼音(大小写)

    Java面试笔试面经.Java技术每天学习一点 公众号Java面试 关注我不迷路 作者:集成显卡 来源:https://blog.csdn.net/ssrc0604hx/ pinyin4J 是一个可以 ...

  2. java 实现汉字转换拼音_Java实现汉字转换为拼音

    # re: Java实现汉字转换为拼音 2006-11-24 15:06 芦苇 JAVA将汉字转化成拼音的方法 /** *//** ################################## ...

  3. [pinyin4j] java版汉字转换拼音(大小写)

    pinyin4J 是一个可以将汉字转换成拼音的lib,非常实用,其maven地址为:http://mvnrepository.com/artifact/com.belerweb/pinyin4j/2. ...

  4. Java之——汉字转换拼音(大小写)

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/55505397 pinyin4J 是一个可以将汉字转换成拼音的lib,非常实用,其m ...

  5. java 实现汉字转换拼音_JAVA实现汉字转拼音功能代码实例

    JAVA中汉字转拼音的方法并不复杂,可以使用pinyin4j包来实现. 一.下载pinyin4j的架包,并导入项目中,如下: 如果是maven项目,maven依赖如下: com.belerweb pi ...

  6. java把汉字转换成拼音_Java实现汉字转换为拼音

    本文的核心代码取自easydozer的blog:http://blog.csdn.net/easydozer/ 代码说明: Java实现汉字转换为拼音的GUI版本. GUI代码部分: /** * @( ...

  7. java把汉字转换成拼音的2种方式

    java程序将汉字转成拼音的两种方法 1.使用pinyin4j将汉字转成拼音,附件为pinyin4j的jar包 Java代码   import net.sourceforge.pinyin4j.Pin ...

  8. Java实现汉字转换拼音功能

    使用工具类: <dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</a ...

  9. 【你不知道的Java】-汉字转换拼音

    一: String cnStr = "钓鱼岛是中国的"; diao yu dao shi zhong guo de 二:code public static String getP ...

  10. java把汉字转换url_url中汉字编码互相转换

    url中汉字编码互相转换 Java代码如下: package com.gjob.common; public class URLtoUTF8 { //转换为%E4%BD%A0形式 public sta ...

最新文章

  1. 成功解决softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be
  2. scala逻辑运算符的一览图和代码案例
  3. PAT (Advanced Level) 1015 Reversible Primes(进制转换)
  4. DEV C++如何不需要通过建项目可以调试程序
  5. java if else过多_Spring Boot中如何干掉过多的if else!
  6. 金属磁记忆传感器封装
  7. python填充_python 实现矩阵填充0的例子
  8. 你不可不知道的React生命周期
  9. 比较简单的解决键盘遮挡文本框的简单方法
  10. 修改APP默认横屏或竖屏
  11. chardet.detect()
  12. 用计算机拜年祝福语,适合拜年发的朋友圈祝福语
  13. 有效管理“刺头”员工的方法
  14. Could not connect to SMTP host localhost port 25
  15. 提高你修养的100句话
  16. 专家调查显示:液晶电视坏眼超等离子电视
  17. B站回应HR称“核心用户都是Loser”、求职者是“白嫖党”:已被劝退
  18. 03.服务限流实现方案
  19. 用浅浅的幸福交换落寞的伤
  20. 偷懒是程序员的一种至高境界

热门文章

  1. qwert rfgfgfh
  2. ELK Logstash 自定义正则模式patterns_dir
  3. 【论文阅读】The Devil is in the Channels: Mutual-Channel Loss for Fine-Grained Image Classification
  4. undefined symbol 问题解决记录
  5. android快速复制粘贴,Android开发复制和粘贴
  6. ad中使用智能粘贴_AD元件复制粘贴使用技巧
  7. javafx-更改程序图标
  8. Python中time.sleep(0.001)真的只等待1毫秒吗?
  9. windows 11激活Office提示网络问题无法激活
  10. 移动端瀑布流/信息流布局以及交互