关闭

使用pinyin4j获取汉字的拼音和全角半角转换

标签: javapinyin4j全角转半角
372人阅读 评论(0) 收藏 举报
分类:

前段时间sprint分配了一项任务,查询一个bug,页面搜索汉字加上拼音的时候,无法匹配。最开始的时候以为拼音函数有问题,所以估了一下点就开始着手这件事情。

拼音工具类如下:

/**  
	 * 获取汉字串拼音首字母,英文字符不变  
	 * @param chinese 汉字串  
	 * @return 汉语拼音首字母  
	 */
	public static String getFirstSpell(String chinese) {
		if(chinese == null){
			return "";
		}
		StringBuffer pybf = new StringBuffer();
		char[] arr = chinese.toCharArray();
		HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
		defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
		defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		for (int i = 0; i < arr.length; i++) {
			if (arr[i] > 128) {
				try {
					String[] temp = PinyinHelper.toHanyuPinyinStringArray(arr[i], defaultFormat);
					if (temp != null) {
						pybf.append(temp[0].charAt(0));
					}
				} catch (BadHanyuPinyinOutputFormatCombination e) {
					e.printStackTrace();
				}
			} else {
				pybf.append(arr[i]);
			}
		}
		return pybf.toString().replaceAll("\\W", "").trim();
	}

方法很简单,先对输入内容进行判别,如果是汉字(arr[i] > 128),那么就使用pinyin4j获取汉字的首字母,其中对于多音字的情况,我这里设置成了只取第一个,并且WITHOUT_TONE没有对几声进行辨识(相对于大多数业务都是不需要的,具体的可以查看API,如果你需要的话。);如果不是汉字的话,我就原样给它加在了返回字符串最后。然后通过repalce替换成只有字母和数字存在的字符串。

看到这里,大家或许觉得都没有问题,但是问题来了。微笑微笑微笑微笑.

输入的字符串中的字母竟然是全角的!!!!!!

我当时可是看了好久,好久,而且还无法复现问题,以为是方法出了问题。期间我对arr[i]>128进行了怀疑,然后通过正则匹配汉字(百度之),阿西吧,it doesn't work!然后我就~~~~~~被测试妹子复现了,哈哈哈哈。接着就是简单的全角转半角了啊。全角转半角的代码出处无法考核,反正是百度的。。

全角转半角代码(其中的全局变量请百度之,哈哈哈哈哈哈)

/**
	 * 全角转半角
	 * 
	 * @param fullWidthStr
	 *            字符串
	 * @return
	 */
	private static String fullWidth2halfWidth(String fullWidthStr) {
		if (null == fullWidthStr || fullWidthStr.length() <= 0) {
			return "";
		}
		char[] charArray = fullWidthStr.toCharArray();
		// 对全角字符转换的char数组遍历
		for (int i = 0; i < charArray.length; ++i) {
			int charIntValue = (int) charArray[i];
			// 如果符合转换关系,将对应下标之间减掉偏移量65248;如果是空格的话,直接做转换
			if (charIntValue >= SBC_CHAR_START && charIntValue <= SBC_CHAR_END) {
				charArray[i] = (char) (charIntValue - CONVERT_STEP);
			} else if (charIntValue == SBC_SPACE) {
				charArray[i] = (char) DBC_SPACE;
			}
		}
		return new String(charArray).toLowerCase();
	}





1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:509次
    • 积分:34
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档