Java:如何通过代码判断字符是拼⾳还是英⽂单词?
最近安卓项⽬开发中遇到⼀个问题,在使⽤百度语⾳合成的功能时,因为⽂章⾥⾯带有,导致⽂字和拼⾳被重复读了⼀遍。
中国⼈民(zhōng guó rén mín )
现在的需求是需要识别⽂章中的汉语拼⾳,然后去掉,不让⽂章拼⾳被语⾳合成。那么问题就出现了:Java如何通过代码识别字符串是否是汉语拼⾳,还是英⽂单词?
java语言使用的字符码集是⽐如:中国⼈民,这个汉语拼⾳是zhōng guó rén mín,但是如果写成了zhong guo ren min,经过百度翻译之后的读⾳是完全不⼀样的。
我们的实现思路:
1)从字符源头控制住,就是把⽂章中带拼⾳标准的地⽅通过特殊的标识进⾏切割掉。存在问题:⽆法确定拼⾳的切割标识,⽐如使⽤括号等⽅式,编辑⽆法统⼀。
2)通过识别字符的编码⽅式判断字符是不是拼⾳?还是普通的英⽂拼⾳字符或者是中⽂拼⾳字符来判断是否进⾏字符切割。
⼤概就是上⾯的两种实现思路,但是第⼀种因为编辑部门可能编辑会出现不同的拼⾳的标识,导致我们⽆法控制内容,所以只能舍弃。只能通过代码的⼿段来判断字符串是拼⾳还是英⽂字符。
说到拼⾳,我们就不得不引⼊⼀个概念:注⾳符号就是带声调的中⽂拼⾳字符。
/**
* 字符转化⼯具类
*/
public class Snippet {
public static void main(String[] args) {
String cn = "ā";
String unicode = "\\u101";
String ch = "a";
String charA = "\\u61";
System.out.println(cnToUnicode(cn));
System.out.println(unicodeToCn(unicode));
System.out.println(cnToUnicode(ch));
System.out.println(unicodeToCn(charA));
// 字符串 : \u5f00\u59cb\u4efb\u52a1 ,由于 \ 在java⾥是转义字符,要写出下⾯这种形式
}
private static String unicodeToCn(String unicode) {
/** 以 \ u 分割,因为java注释也能识别unicode,因此中间加了⼀个空格*/
String[] strs = unicode.split("\\\\u");
String returnStr = "";
// 由于unicode字符串以 \ u 开头,因此分割出的第⼀个字符是""。
for (int i = 1; i < strs.length; i++) {
returnStr += (char) Integer.valueOf(strs[i], 16).intValue();
}
return returnStr;
}
private static String cnToUnicode(String cn) {
char[] chars = cn.toCharArray();
String returnStr = "";
for (int i = 0; i < chars.length; i++) {
returnStr += "\\u" + String(chars[i], 16);
}
return returnStr;
}
}
我们通过调研发现格式,把注⾳符号和英⽂拼⾳字母通过唯⼀的字符集构成,也就是说和通过转化成,都是唯⼀的。因为我们的⽂章是中⽂,转成unicode之后发现注⾳符号和汉语拼⾳字符编码都是唯⼀的,所以我们可以判断⼀个字符⾥⾯是否有注⾳符号来判断这个字符串是汉语拼⾳还是英⽂字符。
但是还有⼀个问题就是如果⽂章⾥⾯的汉语拼⾳是不带注⾳字符的字符集,那么我们通过⽐对单个字符发现不存在注⾳符号就会把它识别成英字符,导致识别失败。
最终问题:如何解决⽂章拼⾳不带注⾳符号导致⽆法识别成汉语拼⾳?
我们可以通过判断字符⾥⾯是否有注⾳符号来判断字符是不是拼⾳,但是如果字符串中不带注⾳符号就会识别失败。
所以⽬前可以通过⼯具类删除⽂章括号⾥⾯的内容,⼯具类代码如下:
private static String deleteSpecialString(String sourceStr){
do{
int fristIndex = 0, lastIndex =0;
ains("(")){
fristIndex = sourceStr.indexOf("(");
lastIndex = sourceStr.indexOf(")");
}else ains("(")){
fristIndex = sourceStr.indexOf("(");
lastIndex = sourceStr.indexOf(")");
}
String substring = sourceStr.substring(fristIndex, lastIndex+1);
String replaceStr = place(substring, "");
sourceStr = replaceStr;
}while (ains("(") || ains("(") );
return sourceStr;
}
上⾯的算法其实可以通过正则表达式来写:
但是这⾥有⼀个问题,就是括号⾥⾯的内容我们没有做判断,如果括号⾥⾯的内容是⽂字的话,是需要机读的。
上⾯的是简单的做法,就是不判断⽂章括号⾥⾯的具体内容,都统⼀删除掉。但是我们如果需要做判断,⽂章括号⾥⾯的是拼⾳或者是英⽂。
待解决问题:
1)如何通过中⽂转成unicode字符码之后,判断字符是不是注⾳符号来判断字符是不是汉语拼⾳。
2)是否有⼯具类可以把⼀长串的拼⾳字符,没有分割标识的情况下来正确的分割字符的拼⾳字符,⽐
如:zhonghuarenmin,这个拼⾳字符串和chinesepublicpe ople这两个字符串,如果正确的分割?
百度语⾳可以正常的识别,等待解决!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。