首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

汉语转换拼音的实现思路以及实现

2012-11-01 
中文转换拼音的实现思路以及实现??? ?在项目中一位大师兄写的中文转换拼音代码:自己整理一下,在此表示感谢

中文转换拼音的实现思路以及实现

??? ?在项目中一位大师兄写的中文转换拼音代码:自己整理一下,在此表示感谢!!^_^

?

?? 首先熟悉一下基础:LinkedHashMap

??? J2SE 1.4 为 Java Collections Framework 引入了两个新实现, LinkedHashSetLinkedHashMap 。添加这两个新实现的好处是散列集合现在可以维护贯穿其元素的两条路径。除标准的散列关系之外,现在还有一个可遍历整个集合的链表。正常情况下,这个新的第二路径会遵循插入顺序,这意味着集合的迭代器将按照元素的插入顺序返回元素(而不按它们的散列码将其组合成一个集合的顺序),但 LinkedHashMap 支持第二种排序选项:按存取顺序而非插入顺序维护链表。

?

???return ascii;
??}

??return 0; // 错误
?}

?/**
? * 根据ASCII码到SpellMap中查找对应的拼音
? *
? * @param ascii
? *??????????? int 字符对应的ASCII
? * @return String 拼音,首先判断ASCII是否>0&<160,如果是返回对应的字符,
? *
? * 否则到SpellMap中查找,如果没有找到拼音,则返回null,如果找到则返回拼音.
? */
?public static String getSpellByAscii(int ascii) {
??if (ascii > 0 && ascii < 160) { // 单字符
???return String.valueOf((char) ascii);
??}

??if (ascii < -20319 || ascii > -10247) { // 不知道的字符
???return null;
??}

??Set keySet = spellMap.keySet();
??Iterator it = keySet.iterator();

??String spell0 = null;
??;
??String spell = null;

??int asciiRang0 = -20319;
??int asciiRang;
??while (it.hasNext()) {

???spell = (String) it.next();
???Object valObj = spellMap.get(spell);
???if (valObj instanceof Integer) {
????asciiRang = ((Integer) valObj).intValue();

????if (ascii >= asciiRang0 && ascii < asciiRang) { // 区间找到
?????return (spell0 == null) ? spell : spell0;
????} else {
?????spell0 = spell;
?????asciiRang0 = asciiRang;
????}
???}
??}

??return null;

?}

?/**
? * 返回字符串的全拼,是汉字转化为全拼,其它字符不进行转换
? *
? * @param cnStr
? *??????????? String 字符串
? * @return String 转换成全拼后的字符串
? */
?public static String getFullSpell(String cnStr) {
??if (null == cnStr || "".equals(cnStr.trim())) {
???return cnStr;
??}

??char[] chars = cnStr.toCharArray();
??StringBuffer retuBuf = new StringBuffer();
??for (int i = 0, Len = chars.length; i < Len; i++) {
???int ascii = getCnAscii(chars[i]);
???if (ascii == 0) { // 取ascii时出错
????retuBuf.append(chars[i]);
???} else {
????String spell = getSpellByAscii(ascii);
????if (spell == null) {
?????retuBuf.append(chars[i]);
????} else {
?????retuBuf.append(spell);
????} // end of if spell == null
???} // end of if ascii <= -20400
??} // end of for

??return retuBuf.toString();
?}

?public static String getFirstSpell(String cnStr) {
??if (null == cnStr || "".equals(cnStr.trim())) {
???return cnStr;
??}

??char[] chars = cnStr.toCharArray();
??StringBuffer retuBuf = new StringBuffer();
??for (int i = 0, Len = chars.length; i < Len; i++) {
???int ascii = getCnAscii(chars[i]);
???if (ascii == 0) { // 取ascii时出错
????retuBuf.append(chars[i]);
???} else {
????String spell = getSpellByAscii(ascii);
????if (spell == null) {
?????retuBuf.append(chars[i]);
????} else {
?????retuBuf.append(spell.charAt(0));
????} // end of if spell == null
???} // end of if ascii <= -20400
??} // end of for

??return retuBuf.toString();
?}

?public static void main(String[] args) {
??String str = null;
??str = "谢海101普降喜雨";
??System.out.println("Spell=" + CnToSpellUtils.getFullSpell(str));

??str = "张牙舞爪》。,";
??System.out.println("Spell=" + CnToSpellUtils.getFullSpell(str));

??str = "猪油戒。";
??System.out.println("Spell=" + CnToSpellUtils.getFullSpell(str));
??str = "澳门";

??System.out.println("Spell=" + CnToSpellUtils.getFirstSpell(str));
?}
}

?

1 楼 Hojave 2010-04-19   楼主试试这几个字:










有问题哦。我的字库一跑,结果一大堆,这个算法整不成。 2 楼 longgangbai 2010-04-19   Hojave 写道楼主试试这几个字:










有问题哦。我的字库一跑,结果一大堆,这个算法整不成。

备注:当时我们仅仅测试的为中文简拼,没有测试全部测试。
如果不能满足那么建议采用开源组件PinYin4J,这个组件内部包含一个2w的字库。
使用详细看:
http://topmanopensource.iteye.com/blog/461343 3 楼 www1231985 2010-04-19   不错   第一次看到这样的需求 呵呵 4 楼 robertliudeqiang 2010-04-19   我也做过拼音转汉字的模块,实事求是,楼主提供的这个方法不太好:

1 汉字的添加需要内嵌到代码里
2 汉字个数支持有限
3 你的汉字是GBK编码的吧? 现在大家普遍的做法是支持UTF-8编码的汉字
4 楼主并没有提多音字的问题,当然,这个问题基本上很难解。我们在实践里也是选取了最常用的读音作为汉字的拼音。

随便说一句: 楼主的这个算法和我们项目开始使用的算法很相似(用php写的),实践中不太好用,后来我们重写了一套。 5 楼 poppk 2010-04-20   gb2312 就包含至少6k多汉字。

代码里才几个ascii码。 6 楼 longgangbai 2010-04-21   robertliudeqiang 写道我也做过拼音转汉字的模块,实事求是,楼主提供的这个方法不太好:

1 汉字的添加需要内嵌到代码里
2 汉字个数支持有限
3 你的汉字是GBK编码的吧? 现在大家普遍的做法是支持UTF-8编码的汉字
4 楼主并没有提多音字的问题,当然,这个问题基本上很难解。我们在实践里也是选取了最常用的读音作为汉字的拼音。

随便说一句: 楼主的这个算法和我们项目开始使用的算法很相似(用php写的),实践中不太好用,后来我们重写了一套。


这个算法可能不好,一般常用的可以解决。建议采用PinYin4J这个组件,这个组件内部提供字库文件,支持汉字大约2W个汉字! 7 楼 longgangbai 2010-04-21   建议大家有时间,看一看汉字转换拼音的算法:
http://topmanopensource.iteye.com/blog/450225

如果有什么问题,或好的解决方案,共享一下谢谢!

热点排行