Bootstrap

Java 中文姓名转换为英文格式

项目中一个需求需要将用户的中文姓名转换为英文格式进行输出,并进行后续证书写入。

如欧阳娜娜需要转换为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();
    }
}


 

;