java拼音汉字转换
1、本文使用pinyin4j.jar包生成汉字的拼音,遇到多音字用此jar包会生成多个拼音,怎样的到最准确的那个拼音比如(长大:zhangda 而不是changda)
需要读取pinyin.txt文件进行过滤;
代码如下:
package pingyin;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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 TMP {
private static Map<String, List<String>> pinyinMap = new HashMap<String, List<String>>();
private static long count = 0;
public static void main(String[] args) {
String str ="";
// String str = "中国人民银行";
initPinyin("./pinyin.txt");
String py = convertChineseToPinyin(str);
System.out.println(str+" = "+py);
}
/**
* 将某个字符串的首字母 大写
* @param str
* @return
*/
public static String convertInitialToUpperCase(String str){
if(str==null){
return null;
}
StringBuffer sb = new StringBuffer();
char[] arr = str.toCharArray();
for(int i=0;i<arr.length;i++){
char ch = arr[i];
if(i==0){
sb.append(String.valueOf(ch).toUpperCase());
}else{
sb.append(ch);
}
}
return sb.toString();
}
/**
* 汉字转拼音 最大匹配优先
* @param chinese
* @return
*/
private static String convertChineseToPinyin(String chinese) {
StringBuffer pinyin = new StringBuffer();
HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
defaultFormat.setCaseType(HanyuPinyinCaseType.LOWERCASE);
defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
char[] arr = chinese.toCharArray();
for (int i = 0; i < arr.length; i++) {
char ch = arr[i];
if (ch > 128) { // 非ASCII码
// 取得当前汉字的所有全拼
try {
String[] results = PinyinHelper.toHanyuPinyinStringArray(
ch, defaultFormat);
if (results == null) { //非中文
return "";
} else {
int len = results.length;
if (len == 1) { // 不是多音字
// pinyin.append(results[0]);
String py = results[0];
if(py.contains("u:")){ //过滤 u:
py = py.replace("u:", "v");
System.out.println("filter u:"+py);
}
pinyin.append(convertInitialToUpperCase(py));
}else if(results[0].equals(results[1])){ //非多音字 有多个音,取第一个
// pinyin.append(results[0]);
pinyin.append(convertInitialToUpperCase(results[0]));
}else { // 多音字
System.out.println("多音字:"+ch);
int length = chinese.length();
boolean flag = false;
String s = null;
List<String> keyList =null;
for (int x = 0; x < len; x++) {
String py = results[x];
if(py.contains("u:")){ //过滤 u:
py = py.replace("u:", "v");
System.out.println("filter u:"+py);
}
keyList = pinyinMap.get(py);
if (i + 3 <= length) { //后向匹配2个汉字 大西洋
s = chinese.substring(i, i + 3);
if (keyList != null && (keyList.contains(s))) {
// if (value != null && value.contains(s)) {
System.out.println("last 2 > " + py);
// pinyin.append(results[x]);
pinyin.append(convertInitialToUpperCase(py));
flag = true;
break;
}
}
if (i + 2 <= length) { //后向匹配 1个汉字 大西
s = chinese.substring(i, i + 2);
if (keyList != null && (keyList.contains(s))) {
System.out.println("last 1 > " + py);
// pinyin.append(results[x]);
pinyin.append(convertInitialToUpperCase(py));
flag = true;
break;
}
}
if ((i - 2 >= 0) && (i+1<=length)) { // 前向匹配2个汉字 龙固大
s = chinese.substring(i - 2, i+1);
if (keyList != null && (keyList.contains(s))) {
System.out.println("before 2 < " + py);
// pinyin.append(results[x]);
pinyin.append(convertInitialToUpperCase(py));
flag = true;
break;
}
}
if ((i - 1 >= 0) && (i+1<=length)) { // 前向匹配1个汉字 固大
s = chinese.substring(i - 1, i+1);
if (keyList != null && (keyList.contains(s))) {
System.out.println("before 1 < " + py);
// pinyin.append(results[x]);
pinyin.append(convertInitialToUpperCase(py));
flag = true;
break;
}
}
if ((i - 1 >= 0) && (i+2<=length)) { //前向1个,后向1个 固大西
s = chinese.substring(i - 1, i+2);
if (keyList != null && (keyList.contains(s))) {
System.out.println("before last 1 <> " + py);
// pinyin.append(results[x]);
pinyin.append(convertInitialToUpperCase(py));
flag = true;
break;
}
}
}
if (!flag) { //都没有找到,匹配默认的 读音 大
s = String.valueOf(ch);
for (int x = 0; x < len; x++) {
String py = results[x];
if(py.contains("u:")){ //过滤 u:
py = py.replace("u:", "v");
System.out.println("filter u:");
}
keyList = pinyinMap.get(py);
if (keyList != null && (keyList.contains(s))) {
System.out.println("default = " + py);
// pinyin.append(results[x]); //如果不需要拼音首字母大写 ,直接返回即可
pinyin.append(convertInitialToUpperCase(py));//拼音首字母 大写
break;
}
}
}
}
}
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
} else {
pinyin.append(arr[i]);
}
}
return pinyin.toString();
}
/**
* 初始化 所有的多音字词组
*
* @param fileName
*/
public static void initPinyin(String fileName) {
// 读取多音字的全部拼音表;
InputStream file = TMP.class.getResourceAsStream("pinyin.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(file));
String s = null;
try {
while ((s = br.readLine()) != null) {
if (s != null) {
String[] arr = s.split("#");
String pinyin = arr[0];
String chinese = arr[1];
if(chinese!=null){
String[] strs = chinese.split(" ");
List<String> list = Arrays.asList(strs);
pinyinMap.put(pinyin, list);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}finally{
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
java拼音汉字转换相关推荐
- java版汉字转换拼音(大小写)
Java面试笔试面经.Java技术每天学习一点 公众号Java面试 关注我不迷路 作者:集成显卡 来源:https://blog.csdn.net/ssrc0604hx/ pinyin4J 是一个可以 ...
- java 实现汉字转换拼音_Java实现汉字转换为拼音
# re: Java实现汉字转换为拼音 2006-11-24 15:06 芦苇 JAVA将汉字转化成拼音的方法 /** *//** ################################## ...
- [pinyin4j] java版汉字转换拼音(大小写)
pinyin4J 是一个可以将汉字转换成拼音的lib,非常实用,其maven地址为:http://mvnrepository.com/artifact/com.belerweb/pinyin4j/2. ...
- Java之——汉字转换拼音(大小写)
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/55505397 pinyin4J 是一个可以将汉字转换成拼音的lib,非常实用,其m ...
- java 实现汉字转换拼音_JAVA实现汉字转拼音功能代码实例
JAVA中汉字转拼音的方法并不复杂,可以使用pinyin4j包来实现. 一.下载pinyin4j的架包,并导入项目中,如下: 如果是maven项目,maven依赖如下: com.belerweb pi ...
- java把汉字转换成拼音_Java实现汉字转换为拼音
本文的核心代码取自easydozer的blog:http://blog.csdn.net/easydozer/ 代码说明: Java实现汉字转换为拼音的GUI版本. GUI代码部分: /** * @( ...
- java把汉字转换成拼音的2种方式
java程序将汉字转成拼音的两种方法 1.使用pinyin4j将汉字转成拼音,附件为pinyin4j的jar包 Java代码 import net.sourceforge.pinyin4j.Pin ...
- Java实现汉字转换拼音功能
使用工具类: <dependency><groupId>com.belerweb</groupId><artifactId>pinyin4j</a ...
- 【你不知道的Java】-汉字转换拼音
一: String cnStr = "钓鱼岛是中国的"; diao yu dao shi zhong guo de 二:code public static String getP ...
- java把汉字转换url_url中汉字编码互相转换
url中汉字编码互相转换 Java代码如下: package com.gjob.common; public class URLtoUTF8 { //转换为%E4%BD%A0形式 public sta ...
最新文章
- 成功解决softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be
- scala逻辑运算符的一览图和代码案例
- PAT (Advanced Level) 1015 Reversible Primes(进制转换)
- DEV C++如何不需要通过建项目可以调试程序
- java if else过多_Spring Boot中如何干掉过多的if else!
- 金属磁记忆传感器封装
- python填充_python 实现矩阵填充0的例子
- 你不可不知道的React生命周期
- 比较简单的解决键盘遮挡文本框的简单方法
- 修改APP默认横屏或竖屏
- chardet.detect()
- 用计算机拜年祝福语,适合拜年发的朋友圈祝福语
- 有效管理“刺头”员工的方法
- Could not connect to SMTP host localhost port 25
- 提高你修养的100句话
- 专家调查显示:液晶电视坏眼超等离子电视
- B站回应HR称“核心用户都是Loser”、求职者是“白嫖党”:已被劝退
- 03.服务限流实现方案
- 用浅浅的幸福交换落寞的伤
- 偷懒是程序员的一种至高境界
热门文章
- qwert rfgfgfh
- ELK Logstash 自定义正则模式patterns_dir
- 【论文阅读】The Devil is in the Channels: Mutual-Channel Loss for Fine-Grained Image Classification
- undefined symbol 问题解决记录
- android快速复制粘贴,Android开发复制和粘贴
- ad中使用智能粘贴_AD元件复制粘贴使用技巧
- javafx-更改程序图标
- Python中time.sleep(0.001)真的只等待1毫秒吗?
- windows 11激活Office提示网络问题无法激活
- 移动端瀑布流/信息流布局以及交互