`
i2534
  • 浏览: 182511 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

获取汉字的五笔,全拼和双拼的工具类

    博客分类:
  • util
 
阅读更多

如题,项目需要,首先可用的自然是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文件看附件,和工具类放在一个包下

 

输出结果:

ZhongHuaRenMinGongHeGuo--WaiJiaoBu
VsHwRfMnGsHeGo--WlJcBu
zhrmghg--wjb
YiQmRBlSjUiSiYiWuQmLuBlQiUiBaWjJqQmL;YiUiRYrSjJcSiFf
[kb, kbs, kbsk]
null
[a, aaa, aaaa]

 

 

分享到:
评论

相关推荐

    行业文档-设计装置-汉字拼写板.zip

    汉字拼写板的设计旨在提高汉字输入的效率和准确性,尤其对于非专业打字人员或者初学者来说,这类工具显得尤为重要。 1. **汉字输入法的发展历程**: - 从最初的机械式打字机到电子计算机的普及,汉字输入法经历了...

    上海交通大学继续教育学院计算机应用基础第二次作业WINDOWS-满分.pdf

    3. 汉字输入法:识别中文输入法的类型,比如全拼、双拼和五笔字型,并理解ASCII码不是汉字输入法。 4. 系统信息查看:掌握如何在Windows中查看硬件信息,例如处理器型号和内存容量,使用右键单击桌面“计算机”图标...

    计算机应用基础全面ppt正式完整版.ppt

    2. **汉字输入法**:学习计算机应用基础的过程中,掌握一种或多种汉字输入法是非常必要的,如拼音输入法(全拼、双拼)、五笔字型等,这些都是日常办公和沟通的基础工具。 3. **中文Windows XP操作系统**:这是微软...

    计算机初级基础教案

    汉字输入法是计算机在中国使用的关键技能,常见的输入法有拼音输入法(如全拼、双拼)、五笔字型等。学习一种输入法并熟练使用,可以提高中文输入效率。 【计算机安全与病毒防范】 计算机安全主要包括正确使用...

    易语言编程系统全书(第一章).doc

    内置多种中文输入法,如首拼、全拼、双拼和英文输入,兼容各种第三方中文输入法,如五笔字型、智能ABC等。 3. **适应中文用户习惯**:日期时间格式、运算符等均采用中文形式,更符合中文用户的阅读习惯。此外,...

    小巧输入法工具 才47k

    4. **设置优化**:调整输入法的细节设置,如候选词个数、输入模式(全拼、简拼、双拼等)、纠错功能、自动记忆等功能。 5. **界面定制**:允许用户选择输入法的皮肤,改变候选窗口的样式,以满足个人喜好。 6. **...

    中英文输入法

    常见的有拼音输入法(如全拼、简拼)、五笔输入法、双拼输入法、手写输入法、语音输入法等。每种输入法都有其独特的编码规则和优化策略,适应不同的用户需求和输入习惯。 5. 构建与部署 文件名中的“build-desktop...

    计算机基础在线测试答案.pdf

    12. **汉字输入法**:ASCII码是一种字符编码,不属于汉字输入法,全拼、五笔字型和双拼是常见的汉字输入法。 13. **Windows应用**:“写字板”和“画图”都是Windows自带的应用,前者可以处理文字和简单图形,后者...

    操作系统习题讲解版.pdf

    6. 中文Windows系统通常提供全拼、双拼等输入法,但不直接提供五笔字型输入法,用户需要额外安装五笔输入法软件。 7. Windows XP支持FAT32和NTFS文件系统,而不支持ext2,后者是Linux操作系统中常见的文件系统。 8...

    计算机基础知识题目与答案(1).pdf

    15. **汉字输入法**:不同输入法包括区位码、全拼、双拼、五笔字型、自然码等,它们是汉字输入的不同方法。 16. **任务管理器**:通过按下Ctrl+Alt+Del组合键可以打开,用于管理运行中的应用程序和进程。 17. **...

    一级B考试考点

    - 音码:如全拼、双拼输入法。 - 形码:如五笔字型输入法。 - 音形码:如自然码输入法。 - **汉字处理码**: - 国标码用于处理汉字系统之间的信息交换。 - 输入码用于将汉字输入计算机。 - 内码用于处理汉字...

    南京职称计算机考试习题.pdf

    15. **汉字输入法种类**:区位、全拼双音、双拼双音、智能全拼、五笔字型和自然码是不同的汉字输入法。 16. **打开任务管理器**:同时按Ctrl + Alt + Del键。 17. **Windows XP窗口描述**:Windows XP桌面不是窗口,...

    南京职称计算机年考试习题.pdf

    15. **汉字输入法**:区位码、全拼双音、双拼双音、智能全拼、五笔字型、自然码等是不同编码方式,用于输入汉字。 16. **打开任务管理器**:按下Ctrl + Alt + Del组合键,可以打开任务管理器,用于结束不响应的程序...

Global site tag (gtag.js) - Google Analytics