如题,项目需要,首先可用的自然是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]