Archive for the ‘Java’ Category

用pinyin4j将汉字转化为拼音
Friday, July 25th, 2008

在合肥的时候,靠骗钱维生的电脑学校很多,而且确实骗到了许多钱,于是形成了良性循环,在电视上打广告,骗更多的钱。有个广告的末尾就是一憨厚的老大爷高兴地说:只有正规,才有机会啊!

某些情况下这句话很对。那些在网上被到处转贴的代码片段,我就不敢信赖,而且格式很乱也看不清楚。在找汉字转拼音程序的时候,我还是选择了pinyin4j,Source Forge上的项目,相对值得信赖。哦对了,这是Java的library.

一个简单的实例方法,使用pinyin4j转换字符串中的汉字为拼音:

public static String toPinyin(String input) {
	StringBuilder sb = new StringBuilder();
	for (int i = 0; i < input.length(); i++) {
		char c = input.charAt(i);
		if (c <= 255) {
			sb.append(c);
		} else {
			String pinyin = null;
			try {
				String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, PINYIN_FORMAT);
				pinyin = pinyinArray[0];
			} catch (BadHanyuPinyinOutputFormatCombination e) {
				logger.error(e.getMessage(), e);
			} catch (NullPointerException e) {
				// 如果是日文,可能抛出该异常
			}
			if (pinyin != null) {
				sb.append(pinyin);
			}
		}
	}
	return sb.toString();
}

其中用到的常量PINYIN_FORMAT是这样初始化的(输出时去除声调标记,发音“驴”的那个韵母用v表示):

PINYIN_FORMAT = new HanyuPinyinOutputFormat();
PINYIN_FORMAT.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
PINYIN_FORMAT.setVCharType(HanyuPinyinVCharType.WITH_V);

因为汉字有多音字,所以PinyinHelper.toHanyuPinyinStringArray返回一个数组。这个方法图省事,就直接选择了第一个读音。如果可能的话,可以将遇到这种多音字的地方提出来,人工进行处理。

org.apache.commons.lang.StringUtils 字符串处理
Saturday, June 28th, 2008

许多开发人员在做项目时都习惯把一些实用方法做成通用的静态方法,放在一起使用,例如对字符串的处理。有些实际编码中十分常用的方法却没有在Java的String类中提供。实际上Apache的commons子项目的lang包就是帮我们解决这个问题的,比如org.apache.commons.lang.StringUtils这个字符串处理的类。

在发现它之前我自己已经有了一个StringUtil类,而粗略看了几眼它的文档,我的所有方法都在org.apache.commons.lang.StringUtils类中都有,并且考虑得更加周全。

例如split方法,在Java中,用逗号分隔一个字符串”a,,b,c,”,结果是一个长度为5的数组:

["a", "", "b", "c", ""]

而大部分情况下,那些空字符串是不想要的,于是在循环中我们就需要一一判断字符串是不是空的。StringUtils.split方法就帮我们按照这种思路来分割字符串。

许多开发人员抱怨Java没有提供一个join方法,StringUtils.join解决了这个问题。

你怎么判断用户的输入是不是空?如果做完整的验证,应该是:

if (input != null && input.trim().length > 0) {…}

StringUtils.isBlank方法为我们做这样的判断,它会正确处理null和全部空格的情况。

StringUtils类还有许多其它的实用方法,可以适应我们日常编程中的大部分字符串处理。另外commons-lang还提供了一个StringEscapeUtils类,可以帮助你防止SQL injection,在HTML中正常输出用户输入的尖括号等。

虽然我没有仔细看过源代码,不过作为通用的方法,commons-lang对性能的考虑应该比较周到,这一点可以放心。