免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2836 | 回复: 0
打印 上一主题 下一主题

汉语转拼音之pinyin4j [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-03-08 20:38 |只看该作者 |倒序浏览
转自 http://www.javaeye.com/topic/790889

汉字转成拼音如果自己实现起来有点麻烦,主要是怕有些汉字转不了,所以就准备使用一个开源的工具Pinyin4j.
      pinyin4j是一个支持将中文转换到拼音的Java开源类库,pinyin4j能够根据中文字符获取其对应的拼音,而且拼音的格式可以定制。pinyin4j的主页:http://pinyin4j.sourceforge.net/
      1. 支持简体中文和繁体中文字符;
      2. 支持转换到汉语拼音,通用拼音, 威妥玛拼音(威玛拼法), 注音符号第二式, 耶鲁拼法和国语罗马字;
      3. 支持多音字,即可以获取一个中文字符的多种发音;
      4. 支持多种字符串输出格式,比如支持Unicode格式的字符ü和声调符号(阴平 "ˉ",阳平"ˊ",上声"ˇ",去声"ˋ"的输出。

    为了方便大家使用,我将源文件和jar包一并放上来了,欢迎大家下载。
     废话少说,下面是我建立的一个通用类,有什么不足的地方希望大家指正。
  1. package com.xyj.com.tool.util;

  2. import net.sourceforge.pinyin4j.PinyinHelper;
  3. import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
  4. import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
  5. import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
  6. import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

  7. /**
  8. * @className:PinyingUtil.java
  9. * @classDescription:拼音操作工具类
  10. * @author:xiayingjie
  11. * @createTime:2010-10-21
  12. */

  13. public class PinyingUtil {

  14.         /**
  15.          * 将字符串转换成拼音数组
  16.          *
  17.          * @param src
  18.          * @return
  19.          */
  20.         public static String[] stringToPinyin(String src) {
  21.                 return stringToPinyin(src, false, null);
  22.         }
  23.         /**
  24.          * 将字符串转换成拼音数组
  25.          *
  26.          * @param src
  27.          * @return
  28.          */
  29.         public static String[] stringToPinyin(String src,String separator) {
  30.                 return stringToPinyin(src, true, separator);
  31.         }

  32.         /**
  33.          * 将字符串转换成拼音数组
  34.          *
  35.          * @param src
  36.          * @param isPolyphone
  37.          *            是否查出多音字的所有拼音
  38.          * @param separator
  39.          *            多音字拼音之间的分隔符
  40.          * @return
  41.          */
  42.         public static String[] stringToPinyin(String src, boolean isPolyphone,
  43.                         String separator) {
  44.                 // 判断字符串是否为空
  45.                 if ("".equals(src) || null == src) {
  46.                         return null;
  47.                 }
  48.                 char[] srcChar = src.toCharArray();
  49.                 int srcCount = srcChar.length;
  50.                 String[] srcStr = new String[srcCount];

  51.                 for (int i = 0; i < srcCount; i++) {
  52.                         srcStr[i] = charToPinyin(srcChar[i], isPolyphone, separator);
  53.                 }
  54.                 return srcStr;
  55.         }

  56.         /**
  57.          * 将单个字符转换成拼音
  58.          *
  59.          * @param src
  60.          * @return
  61.          */
  62.         public static String charToPinyin(char src, boolean isPolyphone,
  63.                         String separator) {
  64.                 // 创建汉语拼音处理类
  65.                 HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
  66.                 // 输出设置,大小写,音标方式
  67.                 defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
  68.                 defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);

  69.                 StringBuffer tempPinying = new StringBuffer();
  70.                

  71.                 // 如果是中文
  72.                 if (src > 128) {
  73.                         try {
  74.                                 // 转换得出结果
  75.                                 String[] strs = PinyinHelper.toHanyuPinyinStringArray(src,
  76.                                                 defaultFormat);
  77.                                
  78.                                                
  79.                                 // 是否查出多音字,默认是查出多音字的第一个字符
  80.                                 if (isPolyphone && null != separator) {
  81.                                         for (int i = 0; i < strs.length; i++) {
  82.                                                 tempPinying.append(strs[i]);
  83.                                                 if (strs.length != (i + 1)) {
  84.                                                         // 多音字之间用特殊符号间隔起来
  85.                                                         tempPinying.append(separator);
  86.                                                 }
  87.                                         }
  88.                                 } else {
  89.                                         tempPinying.append(strs[0]);
  90.                                 }

  91.                         } catch (BadHanyuPinyinOutputFormatCombination e) {
  92.                                 e.printStackTrace();
  93.                         }
  94.                 } else {
  95.                         tempPinying.append(src);
  96.                 }

  97.                 return tempPinying.toString();

  98.         }

  99.        
  100.         public static String hanziToPinyin(String hanzi){
  101.                 return hanziToPinyin(hanzi," ");
  102.         }
  103.         /**
  104.          * 将汉字转换成拼音
  105.          * @param hanzi
  106.          * @param separator
  107.          * @return
  108.          */
  109.         public static String hanziToPinyin(String hanzi,String separator){
  110.                         // 创建汉语拼音处理类
  111.                         HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
  112.                         // 输出设置,大小写,音标方式
  113.                         defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
  114.                         defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
  115.                        
  116.                         String pinyingStr="";
  117.                         try {
  118.                                 pinyingStr=PinyinHelper.toHanyuPinyinString(hanzi, defaultFormat, separator);
  119.                         } catch (BadHanyuPinyinOutputFormatCombination e) {
  120.                                 // TODO Auto-generated catch block
  121.                                 e.printStackTrace();
  122.                         }       
  123.                         return pinyingStr;
  124.         }
  125.         /**
  126.          * 将字符串数组转换成字符串
  127.          * @param str
  128.          * @param separator 各个字符串之间的分隔符
  129.          * @return
  130.          */
  131.         public static String stringArrayToString(String[] str, String separator) {
  132.                 StringBuffer sb = new StringBuffer();
  133.                 for (int i = 0; i < str.length; i++) {
  134.                         sb.append(str[i]);
  135.                         if (str.length != (i + 1)) {
  136.                                 sb.append(separator);
  137.                         }
  138.                 }
  139.                 return sb.toString();
  140.         }
  141.         /**
  142.          * 简单的将各个字符数组之间连接起来
  143.          * @param str
  144.          * @return
  145.          */
  146.         public  static String stringArrayToString(String[] str){
  147.                 return stringArrayToString(str,"");
  148.         }
  149.         /**
  150.          * 将字符数组转换成字符串
  151.          * @param str
  152.          * @param separator 各个字符串之间的分隔符
  153.          * @return
  154.          */
  155.         public static String charArrayToString(char[] ch, String separator) {
  156.                 StringBuffer sb = new StringBuffer();
  157.                 for (int i = 0; i < ch.length; i++) {
  158.                         sb.append(ch[i]);
  159.                         if (ch.length != (i + 1)) {
  160.                                 sb.append(separator);
  161.                         }
  162.                 }
  163.                 return sb.toString();
  164.         }
  165.        
  166.         /**
  167.          * 将字符数组转换成字符串
  168.          * @param str
  169.          * @return
  170.          */
  171.         public static String charArrayToString(char[] ch) {
  172.                 return charArrayToString(ch," ");
  173.         }

  174.         /**
  175.          * 取汉字的首字母
  176.          * @param src
  177.          * @param isCapital 是否是大写
  178.          * @return
  179.          */
  180.         public static char[]  getHeadByChar(char src,boolean isCapital){
  181.                 //如果不是汉字直接返回
  182.                 if (src <= 128) {
  183.                         return new char[]{src};
  184.                 }
  185.                 //获取所有的拼音
  186.                 String []pinyingStr=PinyinHelper.toHanyuPinyinStringArray(src);
  187.                 //创建返回对象
  188.                 int polyphoneSize=pinyingStr.length;
  189.                 char [] headChars=new char[polyphoneSize];
  190.                 int i=0;
  191.                 //截取首字符
  192.                 for(String s:pinyingStr){
  193.                         char headChar=s.charAt(0);
  194.                         //首字母是否大写,默认是小写
  195.                         if(isCapital){
  196.                                 headChars[i]=Character.toUpperCase(headChar);
  197.                          }else{
  198.                                 headChars[i]=headChar;
  199.                          }
  200.                         i++;
  201.                 }
  202.                
  203.                 return headChars;
  204.         }
  205.         /**
  206.          * 取汉字的首字母(默认是大写)
  207.          * @param src
  208.          * @return
  209.          */
  210.         public static char[]  getHeadByChar(char src){
  211.                 return getHeadByChar(src,true);
  212.         }
  213.         /**
  214.          * 查找字符串首字母
  215.          * @param src
  216.          * @return
  217.          */
  218.         public  static String[] getHeadByString(String src){
  219.                 return getHeadByString( src, true);
  220.         }
  221.         /**
  222.          * 查找字符串首字母
  223.          * @param src
  224.          * @param isCapital 是否大写
  225.          * @return
  226.          */
  227.         public  static String[] getHeadByString(String src,boolean isCapital){
  228.                 return getHeadByString( src, isCapital,null);
  229.         }
  230.         /**
  231.          * 查找字符串首字母
  232.          * @param src
  233.          * @param isCapital 是否大写
  234.          * @param separator 分隔符
  235.          * @return
  236.          */
  237.         public  static String[] getHeadByString(String src,boolean isCapital,String separator){
  238.                 char[]chars=src.toCharArray();
  239.                 String[] headString=new String[chars.length];
  240.                 int i=0;
  241.                 for(char ch:chars){
  242.                        
  243.                         char[]chs=getHeadByChar(ch,isCapital);
  244.                         StringBuffer sb=new StringBuffer();
  245.                         if(null!=separator){
  246.                                 int j=1;
  247.                                
  248.                                 for(char ch1:chs){
  249.                                         sb.append(ch1);
  250.                                         if(j!=chs.length){
  251.                                                 sb.append(separator);
  252.                                         }
  253.                                         j++;
  254.                                 }
  255.                         }else{
  256.                                 sb.append(chs[0]);
  257.                         }
  258.                         headString[i]=sb.toString();
  259.                         i++;
  260.                 }
  261.                 return headString;
  262.         }
  263.        
  264.         public static void main(String[] args) {
  265.                 System.out.println(stringArrayToString(getHeadByString("我se 心")));
  266.         }

  267. }
复制代码
pinyin4j.rar (196.5 KB, 下载次数: 119)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP