最近安卓项目开发中遇到一个问题,在使用百度语音合成的功能时,因为文章里面带有拼音注解,导致文字和拼音被重复读了一遍。

中国人民(zhōng guó rén mín )

现在的需求是需要识别文章中的汉语拼音,然后去掉,不让文章拼音被语音合成。那么问题就出现了: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" + Integer.toString(chars[i], 16);}return returnStr;}
}


我们通过调研发现Unicode编码格式,把注音符号和英文拼音字母通过唯一的字符集构成,也就是说注音符号和英文26个字母通过转化成unicode字符,都是唯一的。因为我们的文章是中文,转成unicode之后发现注音符号和汉语拼音字符编码都是唯一的,所以我们可以判断一个字符里面是否有注音符号来判断这个字符串是汉语拼音还是英文字符。
Unicode 和 UTF-8 有什么区别?
但是还有一个问题就是如果文章里面的汉语拼音是不带注音字符的字符集,那么我们通过比对单个字符发现不存在注音符号就会把它识别成英字符,导致识别失败。

最终问题:如何解决文章拼音不带注音符号导致无法识别成汉语拼音?

我们可以通过判断字符里面是否有注音符号来判断字符是不是拼音,但是如果字符串中不带注音符号就会识别失败。
所以目前可以通过工具类删除文章括号里面的内容,工具类代码如下:

 private static String deleteSpecialString(String sourceStr){do{int fristIndex = 0, lastIndex =0;if(sourceStr.contains("(")){fristIndex = sourceStr.indexOf("(");lastIndex = sourceStr.indexOf(")");}else if(sourceStr.contains("(")){fristIndex = sourceStr.indexOf("(");lastIndex = sourceStr.indexOf(")");}String substring = sourceStr.substring(fristIndex, lastIndex+1);String replaceStr = sourceStr.replace(substring, "");sourceStr = replaceStr;}while (sourceStr.contains("(") || sourceStr.contains("(") );return sourceStr;}


上面的算法其实可以通过正则表达式来写:利用正则表达式提取括号内内容。
但是这里有一个问题,就是括号里面的内容我们没有做判断,如果括号里面的内容是文字的话,是需要机读的。
上面的是简单的做法,就是不判断文章括号里面的具体内容,都统一删除掉。但是我们如果需要做判断,文章括号里面的是拼音或者是英文。

待解决问题:
1)如何通过中文转成unicode字符码之后,判断字符是不是注音符号来判断字符是不是汉语拼音。
2)是否有工具类可以把一长串的拼音字符,没有分割标识的情况下来正确的分割字符的拼音字符,比如:zhonghuarenmin,这个拼音字符串和chinesepublicpeople这两个字符串,如果正确的分割?

百度语音可以正常的识别,等待解决!

Java:如何通过代码判断字符是拼音还是英文单词?相关推荐

  1. java如何通过if判断字符_java如何用if判断字符串是否相等

    java如何用if判断字符串是否相等 发布时间:2020-06-16 09:30:54 来源:亿速云 阅读:58 作者:Leah java如何用if判断字符串是否相等?针对这个问题,今天小编总结了这篇 ...

  2. 新手java五子棋完整代码判断落子落在线上_JAVA五子棋开发

    让我们来思考一个问题:如何用Java来开发出一个五子棋项目?首先,没有界面其它的也就无从谈起,这里需要用到Java的SWING与AWT组件:有了五子棋界面,我们要能在界面上画出黑白棋子:最后,能够对输 ...

  3. 新手java五子棋完整代码判断落子落在线上_Java初学者,编写小游戏五子棋的问题?...

    首先你需要掌握GUI编程,事件处理,已经监听器,你就掌握Swing的知识就好了Swing框架,JFrame,JPanel,鼠标.键盘监听事件 Java基础,面向对象,异常处理,集合,IO流 网络编程, ...

  4. Java(79):Character.isDigit() 判断输入的数据是否大于等于零整数

    /*** @param str* @function 判断输入的数据是否是大于等于零的整数*/public static boolean isNumeric(String str) {for (int ...

  5. java判断是否第一次出现_利用java判断字符首次出现的位置,java替换最后一个特定字符...

    利用java判断字符首次出现的位置利用爪哇判断字符首次出现的位置, 目的: (学习视频分享:java视频教程 实现代码如下: 导入Java.util.收藏品: 导入Java.util.LinkedLi ...

  6. java怎么判断字符是否为空?有哪几种方法?

    关于java判断字符是否为空的文章早已是非常多了,本文是对我个人过往学习java,理解及应用java的一个总结.此文内容涉及java判断字符是否为空的四种方法,以及相关问题补充,希望对大家有所帮助. ...

  7. java 判断是否字母_java判断字符是否为字母的方法

    java判断字符是否为字母的方法 发布时间:2020-06-29 18:01:37 来源:亿速云 阅读:239 作者:Leah 这篇文章运用简单易懂的例子给大家介绍java判断字符是否为字母的方法,代 ...

  8. Java 判断字符是大写小写或者数字

    使用character类 Character.isLowerCase(Schar.charAt(i)) //获取字符串Schar中的某一个字符然后借用character类的方法来判断是不是小写. 其他 ...

  9. java 字符是否存在_java判断字符是否存在的方法

    java判断字符是否存在的方法 发布时间:2020-06-10 09:41:51 来源:亿速云 阅读:165 作者:Leah 这篇文章给大家分享的是java判断字符是否存在的方法.小编觉得挺实用的,因 ...

  10. java char是否为数字_java判断字符是否为数字

    java中判断字符是否数字的方法:(推荐:java视频教程) 方法一:用JAVA自带的函数public static boolean isNumeric(String str){ for (int i ...

最新文章

  1. ASP.NET2.0轻松搞定统计图表【月儿原创】
  2. 在CentOS/Debian/Ubuntu上编译安装最新版 GCC 8 , cmake 3 和ninja
  3. RHEL6网络相关配置
  4. 触摸屏中文软件_八招轻松搞定西门子软件安装!
  5. 栈的逆转(递归实现)
  6. vim配置文件~/.vimrc
  7. ubuntu在线安装和卸载libusb
  8. Effective C# Item22:使用事件定义外发接口
  9. MariaDB Spider 数据库分库分表实践 分库分表
  10. 2招解决并发问题,省几百万设备费用!说穿了很简单...
  11. PyCharm PyQt5创建主窗口源代码
  12. CCF201604-1 折点计数(解法二)(100分)(废除!!!)
  13. 「快手极速版」榜 App Store 总榜第一
  14. OSDI 2022 Roller 论文解读
  15. rs485的1:n计算机连接和n:n的主从plc通讯,富士人机界面与GE90-70 PLC N:1通讯在轧钢生产线的应用...
  16. 3、SPSS做非参数检验
  17. 快速了解微信小程序的使用,一个根据小程序的框架开发的 todos app
  18. Mui的APPLOGO数字角标小米问题
  19. presto获取上月第一天和最后一天、当月第一天
  20. —— GPS测量原理及应用复习-8 ——

热门文章

  1. Android 12 WiFi 框架
  2. windows下载安装cmake
  3. FPGA学习经验分享——入门篇
  4. ASM1053E ASM1153E对比
  5. matlab系统辨识尝试之详细过程1,系统辨识工具箱教程
  6. php lwm2m,LwM2M和CoAP及它们之间的关系
  7. 国家统计局全国统计用区划代码和城乡划分代码Python爬虫样例
  8. 华为c语言笔试题下载,2005年华为招聘--C语言笔试试题
  9. java读取gpx文件格式,Gpx文件基本格式及常见错误——乱码
  10. 基于电子商务网站开发的项目管理计划设计