java将中文转为拼音

本文介绍了如何使用Java进行中文字符转换成对应的拼音,包括转换的方法和相关库的使用,适用于需要处理中文字符串拼音化的场景。

java将中文转为拼音

项目需求,需要将一批工号批量入库,但产品经理提供的却是中文……没办法,只好用程序转了。
做法是将人名保存为文本文件,每行一个。并且采用pinyin4j包进行转换,值得提的是pinyin4j对多音字特别是姓氏转换不是特别准确,因此遇到多音字姓氏就需要自行判断并转换了。再者,由于同名的原因,为了区分姓名中还参杂着阿拉伯数字,因此在判断时还要加以区分。
// 中文转拼音
Maple
// An highlighted block
/*
程序目的:将中文转换为拼音
程序版本:JDK13
程序编写:枫叶
编写时间:2020年3月2日
 */
package org.translation;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

public class ChineseToPinYin 
{
	public static String PROVINCE = "GuangXi";
    //接收外部传进的参数方法
    public String getChineseWord(String words)
    {
        String tranWord = translateToPinYin(words);
        return tranWord;
    }
    //中文转换为拼音
    private String translateToPinYin(String words)
    {
        String pinYin = "";
        String name = "";
        //中文转换成拼音
        char[] singleWord = words.toCharArray();
        HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
        defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
        defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
        int flag = 0;
        String regex = "[\u4E00-\u9FA5]+"; //定义中文字符的unicode范围
        for(int i=0;i<singleWord.length;i++)
        {
            ////判断是否为中文字符
            if(!String.valueOf(singleWord[i]).matches(regex))
            {
                pinYin += singleWord[i];
            }
            else
            {
				try {
					flag++;
					// System.out.println("flag:"+flag);
					if ((String.valueOf(singleWord[i]).equals("覃")) && (flag == 1)) {
						pinYin += firstNamePin(String.valueOf(singleWord[i]));
						flag = 0;
					} else if ((String.valueOf(singleWord[i]).equals("区")) && (flag == 1)) {
						pinYin += firstNamePin(String.valueOf(singleWord[i]));
						flag = 0;
					} else if ((String.valueOf(singleWord[i]).equals("牟")) && (flag == 1)) {
						pinYin += firstNamePin(String.valueOf(singleWord[i]));
						flag = 0;
					} else if ((String.valueOf(singleWord[i]).equals("单")) && (flag == 1)) {
						pinYin += firstNamePin(String.valueOf(singleWord[i]));
						flag = 0;
					} else {
						name = convertFisrtToBig(
								PinyinHelper.toHanyuPinyinStringArray(singleWord[i], defaultFormat)[0]);
						pinYin += name;
					}

				} catch (BadHanyuPinyinOutputFormatCombination e) {
					e.printStackTrace();
				}
            }
        }
        return words+"|"+PROVINCE+pinYin;
    }
    //首字母转为大写方法
    public static String convertFisrtToBig(String str)
    {
        String first = str.substring(0,1).toUpperCase();
        String after = str.substring(1).toLowerCase();
        return first+after;
    }
    //多音字解决方法,尤其是姓氏
    public static String firstNamePin(String name)
    {
        String n = "";
        if(name.equals("覃"))
        {
            n = "Qin";
        }
        else if(name.equals("区"))
        {
            n = "Ou";
        }
        else if(name.equals("牟"))
        {
            n = "Mu";
        }
        else if(name.equals("单"))
        {
            n = "Shan";
        }
        return n;
    }
}
// 中文转拼音
Maple
// An highlighted block
/*
 * 程序目的:从文本文件中获取中文后转换成拼音,并且首字母大写,同时将转换好的数据保存入文本文件
 * 程序版本:JDK13
 * 程序编写:枫叶
 * 编写时间:2020年3月2日
 */
package org.translation;

import java.io.*;
import java.util.Date;
import java.text.SimpleDateFormat;

public class GetDataFromFile 
{
	public static String CHARSET = "UTF8";
    //对外接口方法
    public void getFileName(String fileName)
    {
        fetchDataFromTxt(fileName);
    }
    //读取文本文件中的数据
    private void fetchDataFromTxt(String fileName)
    {
        ChineseToPinYin ctpy = new ChineseToPinYin();
        File f = new File(fileName);
        InputStreamReader reader = null;
        BufferedReader br = null;
        BufferedWriter bw = null;
        String line = "";
        String reStr = "";
        int counter = 0;
        //定义写入文件的文件名
        SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
        String wFileName = "PinYin"+df.format(new Date())+".txt";
        try
        {
            reader = new InputStreamReader(new FileInputStream(f), CHARSET);
            br = new BufferedReader(reader);
            bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(wFileName,true), CHARSET));
            while((line=br.readLine())!=null)
            {
                counter++;
                reStr = ctpy.getChineseWord(line);
                bw.write(reStr);
                bw.newLine();
                bw.flush();
                System.out.println(reStr);
            }
            System.out.println("共读取"+counter+"条记录");
            System.out.println("保存文件成功...");
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if(br!=null)
            {
                try
                {
                    br.close();
                    System.out.println("已关闭缓冲流...");
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
            }
            if(reader!=null)
            {
                try
                {
                    reader.close();
                    System.out.println("已关闭输入流...");
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
            }
            if(bw!=null)
            {
                try
                {
                    bw.close();
                    System.out.println("已关闭写入流...");
                }
                catch(IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
    //main
    public static void main(String args[])
    {
        System.out.println("---------本程序用于将中文转换为拼音字母---------");
        String fileName = "userName.txt";
        //定义开始时间
        long startTime = new Date().getTime();
        new GetDataFromFile().getFileName(fileName);
        //定义结束时间
        long finishTime = new Date().getTime();
        System.out.println("本次运行时间为"+(finishTime-startTime)/1000+"秒" );
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值