浏览 3918 次
锁定老帖子 主题:获取汉字的五笔,全拼和双拼的工具类
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-10
如题,项目需要,首先可用的自然是pinyin4j. 在不考虑多音字的情况下,全拼自然搞定. 双拼只是替换了全拼的声母和韵母,使用正则和对照也可以搞定.就是要注意声母中并没有y和w,但是常用拼音中却有,正则中要加入这两个. 五笔的话,参看我上一篇文章.
这里放出工具类,注意引入pinyin4j-2.5.jar包
public class StringUtil { /** * 匹配单个字符全拼的声母和韵母,声母可能不存在.注意y和w,虽然不在声母范围,但是居首也是有可能的 */ private static final Pattern psp = Pattern .compile("^([bpmfdtnlgkhjqxrzcsyw]{0,2})([aeiouv][a-z]*)$"); private static HanyuPinyinOutputFormat hpof; private static Properties wb86; private static Properties shuangPin; static { // 拼音格式 hpof = new HanyuPinyinOutputFormat(); hpof.setCaseType(HanyuPinyinCaseType.LOWERCASE);// 输出全小写 hpof.setToneType(HanyuPinyinToneType.WITHOUT_TONE);// 不显示音调 hpof.setVCharType(HanyuPinyinVCharType.WITH_V);// ü替换为v // 五笔数据 wb86 = new Properties(); try { wb86.load(new BufferedInputStream(StringUtil.class .getResourceAsStream("wb86.properties"))); } catch (IOException e) { e.printStackTrace(); } // 双拼 shuangPin = new Properties(); try { shuangPin.load(new BufferedInputStream(StringUtil.class .getResourceAsStream("sp.properties"))); } catch (IOException e) { e.printStackTrace(); } } /** * 字符转化为拼音.无法转换返回null,转换成功返回所有的发音 * * @param c * @return */ public static String[] charToPinyin(char c) { if (c < 0x4E00 || c > 0x9FA5) {// GBK字库在unicode中的起始和结束位置 if (c != 0x3007) {// 圆圈0比较特殊,需要处理一下 return null; } } try { return PinyinHelper.toHanyuPinyinStringArray(c, hpof); } catch (BadHanyuPinyinOutputFormatCombination e) { return null; } } /** * 获取单个字符的双拼,顺序和全拼一致 * * @param c * @return */ public static String[] charToShuangPin(char c) { String[] array = charToPinyin(c); if (array == null) { return array; } String[] result = new String[array.length]; for (int i = 0; i < array.length; i++) { String s = array[i]; Matcher m = psp.matcher(s); if (m.matches()) { String sm = m.group(1); String smdz = shuangPin.getProperty(sm); String ym = m.group(2); String ymdz = shuangPin.getProperty(ym); String r = ""; if (smdz != null) { r = smdz; } if (ymdz != null) { r += ymdz; } result[i] = r; } else { System.err.println("分解" + c + "拼音的拼音时发生错误!无法拆分出声母和韵母."); } } return result; } /** * 返回字符串的拼音的首字母,每个多音字只取第一个发音. * * @param s * @return */ public static String toPinyinShouZiMu(String s) { if (s == null || s.length() == 0) { return null; } StringBuilder sb = new StringBuilder(); for (char c : s.toCharArray()) { String[] r = charToPinyin(c); if (r == null) { sb.append(c); } else { String py = r[0]; if (py.length() > 0) { sb.append(py.charAt(0)); } } } return sb.toString(); } /** * 返回字符串的拼音,全拼,每个字的首字母大写,每个多音字只取第一个发音. * * @param s * @return */ public static String toQuanPin(String s) { if (s == null || s.length() == 0) { return null; } StringBuilder sb = new StringBuilder(); for (char c : s.toCharArray()) { String[] r = charToPinyin(c); if (r == null) { sb.append(c); } else { String py = r[0]; if (py.length() > 0) { char f = Character.toUpperCase(py.charAt(0)); // if ((f == 'A' || f == 'O' || f == 'E') && sb.length() > // 0) { // aoe 开头的音节连接在其它音节后面的时候,如果音节的界限发生混淆,用隔音符号(')隔开,例如 // pí'ǎo(皮袄)xī'ān(西安)。 // py = "'" + f + py.substring(1); // } else { py = f + py.substring(1); // } } sb.append(py); } } return sb.toString(); } /** * 返回字符串的双拼.多音字只取第一个发音.每个字的首字母大写 * * @param s * @return */ public static String toShuangPin(String s) { if (s == null || s.length() == 0) { return null; } StringBuilder sb = new StringBuilder(); for (char c : s.toCharArray()) { String[] r = charToShuangPin(c); if (r == null) { sb.append(c); } else { String py = r[0]; if (py.length() > 0) { char f = Character.toUpperCase(py.charAt(0)); py = f + py.substring(1); } sb.append(py); } } return sb.toString(); } /** * 字符转化为五笔(86),无法转化返回null * * @param c * @return */ public static String[] charToWubi(char c) { if (c < 0x4E00 || c > 0x9FA5) {// GBK字库在unicode中的起始和结束位置 return null; } String result = wb86.getProperty(Integer.toHexString(c).toUpperCase()); if (result == null) { return null; } if (result.contains(",")) { return result.split(","); } else { return new String[] { result }; } } public static void main(String[] args) { System.out.println(toQuanPin("中华人民共和国--中联部")); System.out.println(toShuangPin("中华人民共和国--中联部")); System.out.println(toPinyinShouZiMu("中华人民共和国--中联部")); System.out.println(toShuangPin("壹仟贰佰叁拾肆亿伍仟陆佰柒拾捌万玖仟零壹拾贰元叁角肆分")); System.out.println(Arrays.deepToString(charToWubi('啊'))); System.out.println(Arrays.deepToString(charToWubi('A'))); System.out.println(Arrays.deepToString(charToWubi('工'))); } }
两个properties文件看附件,和工具类放在一个包下
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |