项目中一个需求需要将用户的中文姓名转换为英文格式进行输出,并进行后续证书写入。
如欧阳娜娜需要转换为NANA OUYANG,张三转换为SAN ZHANG,若不是纯中文则直接原文返回即可。
首先需要处理姓和名的分离 然后再是对中文转拼音并转大写即可。
需要用到net.sourceforge.pinyin4j,在项目pom.xml增加
<dependency>
<groupId>com.belerweb</groupId>
<artifactId>pinyin4j</artifactId>
<version>2.5.1</version>
</dependency>
第一步判断是否中文
/**
* 一个汉字或者多个汉字
* @param str
* @return
*/
public static Boolean isChinese(String str) {
Pattern pattern = Pattern.compile("[\u4e00-\u9fa5]+");
Matcher matcher = pattern.matcher(str);
return matcher.matches();
}
第二步需要整理出复姓清单
private static String[] doubleFamilyName = {
"万俟","司马","上官","欧阳","夏侯","诸葛","闻人","东方","赫连","皇甫","尉迟","公羊","澹台","公冶","宗政","濮阳","淳于","单于","太叔","申屠","公孙","仲孙","轩辕","令狐","钟离","宇文","长孙","慕容","鲜于","闾丘","司徒","司空","亓官","司寇","子车","颛孙","端木","巫马","公西","漆雕","乐正","壤驷","公良","拓跋","夹谷","宰父","谷梁","段干","百里","东郭","南门","呼延","羊舌","微生","梁丘","左丘","东门","西门","南宫","第五"
};
第三步进行判断拆分组装即可
/**
* 中文名转英文格式名
* @param name
* @return
*/
public static String ChineseName2Eng(String name){
if(name == null || name.length()<=0){
return "";
}
if(!isChinese(name)){
return name.toUpperCase();
}
String firstName = "";
String lastName = "";
if(name.length()==1){
lastName = name;
} else if(name.length()==2){
firstName = name.substring(0,1);
lastName = name.substring(1,2);
}else if(name.length()>2){
boolean isDoubleFamilyName = false;
for (String dName : doubleFamilyName) {
if (name.contains(dName)) {
isDoubleFamilyName = true;
firstName = dName;
break;
}
}
if(isDoubleFamilyName){
lastName = name.substring(firstName.length(),name.length());
}else{
firstName = name.substring(0,1);
lastName = name.substring(1,name.length());
}
}
// 设置不带声调的输出选项
net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat format = new net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat();
format.setToneType(net.sourceforge.pinyin4j.format.HanyuPinyinToneType.WITHOUT_TONE);
StringBuilder output = new StringBuilder();
for (char c : lastName.toCharArray()) {
try {
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, format);
if (pinyinArray != null && pinyinArray.length > 0) {
output.append(pinyinArray[0]);
}
} catch (Exception e) {
output.append(c);
}
}
output.append(" ");
for (char c : firstName.toCharArray()) {
try {
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, format);
if (pinyinArray != null && pinyinArray.length > 0) {
output.append(pinyinArray[0]);
}
} catch (Exception e) {
output.append(c).append(" ");
}
}
return output.toString().toUpperCase().trim();
}
完整代码:
/**
* 姓名中文转英文工具类
* @author zzj
*/
public class NameUtils {
private static String[] doubleFamilyName = {
"万俟","司马","上官","欧阳","夏侯","诸葛","闻人","东方","赫连","皇甫","尉迟","公羊","澹台","公冶","宗政","濮阳","淳于","单于","太叔","申屠","公孙","仲孙","轩辕","令狐","钟离","宇文","长孙","慕容","鲜于","闾丘","司徒","司空","亓官","司寇","子车","颛孙","端木","巫马","公西","漆雕","乐正","壤驷","公良","拓跋","夹谷","宰父","谷梁","段干","百里","东郭","南门","呼延","羊舌","微生","梁丘","左丘","东门","西门","南宫","第五"
};
/**
* 一个汉字或者多个汉字
* @param str
* @return
*/
public static Boolean isChinese(String str) {
Pattern pattern = Pattern.compile("[\u4e00-\u9fa5]+");
Matcher matcher = pattern.matcher(str);
return matcher.matches();
}
/**
* 中文名转英文格式名
* @param name
* @return
*/
public static String ChineseName2Eng(String name){
if(name == null || name.length()<=0){
return "";
}
if(!isChinese(name)){
return name.toUpperCase();
}
String firstName = "";
String lastName = "";
if(name.length()==1){
lastName = name;
} else if(name.length()==2){
firstName = name.substring(0,1);
lastName = name.substring(1,2);
}else if(name.length()>2){
boolean isDoubleFamilyName = false;
for (String dName : doubleFamilyName) {
if (name.contains(dName)) {
isDoubleFamilyName = true;
firstName = dName;
break;
}
}
if(isDoubleFamilyName){
lastName = name.substring(firstName.length(),name.length());
}else{
firstName = name.substring(0,1);
lastName = name.substring(1,name.length());
}
}
// 设置不带声调的输出选项
net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat format = new net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat();
format.setToneType(net.sourceforge.pinyin4j.format.HanyuPinyinToneType.WITHOUT_TONE);
StringBuilder output = new StringBuilder();
for (char c : lastName.toCharArray()) {
try {
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, format);
if (pinyinArray != null && pinyinArray.length > 0) {
output.append(pinyinArray[0]);
}
} catch (Exception e) {
output.append(c);
}
}
output.append(" ");
for (char c : firstName.toCharArray()) {
try {
String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, format);
if (pinyinArray != null && pinyinArray.length > 0) {
output.append(pinyinArray[0]);
}
} catch (Exception e) {
output.append(c).append(" ");
}
}
return output.toString().toUpperCase().trim();
}
}