android实现汉字转拼音功能 带多音字识别

发布时间 - 2026-01-10 23:17:25    点击率:

android 汉字转拼音带多音字识别功能,供大家参考,具体内容如下

问题来源

在做地名按首字母排序的时候出现了这样一个bug。长沙会被翻译拼音成zhangsha,重庆会被翻译拼音成zhong qing。于是排序出了问题。

汉字转拼音库和多音字识别库
1.多音字对应的词汇库
2.文字的二进制大小对应的拼音库

关键代码

1.我在这里首先将要转化的文字转化成对应的”gb2312”编码。汉字转化成二进制编码一般占两个字节,如果一个字节返回字符,如果是两个字节算一下偏移量。代码如下

 /** * 汉字转成ASCII码 * * @param chs * @return */
  private int getChsAscii(String chs) {
   int asc = 0;
   try {
    byte[] bytes = chs.getBytes("gb2312");
    if (bytes == null || bytes.length > 2 || bytes.length <= 0) {
     throw new RuntimeException("illegal resource string");
    }
    if (bytes.length == 1) {
     asc = bytes[0];
    }
    if (bytes.length == 2) {
     int hightByte = 256 + bytes[0];
     int lowByte = 256 + bytes[1];
     asc = (256 * hightByte + lowByte) - 256 * 256;
    }
   } catch (Exception e) {
    System.out.println("ERROR:ChineseSpelling.class-getChsAscii(String chs)" + e);
   }
   return asc;
  }

2.将单个汉字获取的拼音再和多音字库的hashMap进行比较,代码如下:

public String getSellingWithPolyphone(String chs){
   if(polyphoneMap != null && polyphoneMap.isEmpty()){
    polyphoneMap = initDictionary();
   }

   String key, value, resultPy = null;
   buffer = new StringBuilder();
   for (int i = 0; i < chs.length(); i++) {
    key = chs.substring(i, i + 1);
    if (key.getBytes().length >= 2) {
     value = (String) convert(key);
     if (value == null) {
      value = "unknown";
     }
    } else {
     value = key;
    }
    resultPy = value;

    String left = null;
    if(i>=1 && i+1 <= chs.length()){
     left = chs.substring(i-1,i+1);
     if(polyphoneMap.containsKey(value) && polyphoneMap.get(value).contains(left)){
      resultPy = value;
     }
    }
//    if(chs.contains("重庆")){
     String right = null; //向右多取一个字,例如 [长]沙
     if(i<=chs.length()-2){
      right = chs.substring(i,i+2);
      if(polyphoneMap.containsKey(right)){
       resultPy = polyphoneMap.get(right);
      }
     }
//    }

    String middle = null; //左右各多取一个字,例如 龙[爪]槐
    if(i>=1 && i+2<=chs.length()){
     middle = chs.substring(i-1,i+2);
     if(polyphoneMap.containsKey(value) && polyphoneMap.get(value).contains(middle)){
      resultPy = value;
     }
    }

    String left3 = null; //向左多取2个字,如 芈月[传],列车长
    if(i>=2 && i+1<=chs.length()){
     left3 = chs.substring(i-2,i+1);
     if(polyphoneMap.containsKey(value) && polyphoneMap.get(value).contains(left3)){
      resultPy = value;
     }
    }

    String right3 = null; //向右多取2个字,如 [长]孙无忌
    if(i<=chs.length()-3){
     right3 = chs.substring(i,i+3);
     if(polyphoneMap.containsKey(value) && polyphoneMap.get(value).contains(right3)){
      resultPy = value;
     }
    }

    buffer.append(resultPy);
   }
   return buffer.toString();
  }

3.将asserts文件内容解析生成HashMap列表.

 public HashMap<String, String> initDictionary(){
  String fileName = "py4j.dic";
  InputStreamReader inputReader = null;
  BufferedReader bufferedReader = null;
  HashMap<String, String> polyphoneMap = new HashMap<String, String>();
  try{
   inputReader = new InputStreamReader(MyApplication.mContext.getResources().getAssets().open(fileName),"UTF-8");
   bufferedReader = new BufferedReader(inputReader);
   String line = null;
   while((line = bufferedReader.readLine()) != null){
    String[] arr = line.split(PINYIN_SEPARATOR);
    if(isNotEmpty(arr[1])){
     String[] dyzs = arr[1].split(WORD_SEPARATOR);
     for(String dyz: dyzs){
      if(isNotEmpty(dyz)){
       polyphoneMap.put(dyz.trim(),arr[0]);
      }
     }
    }
   }
  }catch(Exception e){
   e.printStackTrace();
  }finally{
   if(inputReader != null){
    try {
     inputReader.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   if(bufferedReader != null){
    try {
     bufferedReader.close();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }
  return polyphoneMap;
 }

github源码下载:https://github.com/loveburce/ChinesePolyphone.git

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# android汉字转拼音  # android多音字识别  # android汉字拼音互转  # Android实现中文按拼音排序方法  # Android实现ListView的A-Z字母排序和过滤搜索功能 实现汉字转成拼音  # android仿微信通讯录搜索示例(匹配拼音  # 字母  # 索引位置)  # Android开发实现的IntentUtil跳转多功能工具类【包含视频、音频、图片、摄像头等操作功能  # android实用工具类分享(获取内存/检查网络/屏幕高度/手机分辨率)  # android开发教程之实现toast工具类  # 19个Android常用工具类汇总  # android 一些工具类汇总  # Android7.0 工具类:DiffUtil详解  # 非常实用的Android图片工具类  # Android开发之拼音转换工具类PinyinUtils示例  # 重庆  # 一个字  # 个字  # 转化成  # 出了  # 长沙  # 这样一个  # 我在这里  # 具体内容  # 转成  # 无忌  # 大家多多  # 源码下载  # 出现了  # 首字母  # 偏移量  # public  # throw  # hashMap  # illegal 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel怎么上传文件_Laravel图片上传及存储配置  黑客入侵网站服务器的常见手法有哪些?  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel怎么为数据库表字段添加索引以优化查询  ,怎么在广州志愿者网站注册?  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  Laravel如何实现本地化和多语言支持?(i18n教程)  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  实现点击下箭头变上箭头来回切换的两种方法【推荐】  Linux系统命令中tree命令详解  Laravel怎么实现观察者模式Observer_Laravel模型事件监听与解耦开发【指南】  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  详解vue.js组件化开发实践  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  济南网站建设制作公司,室内设计网站一般都有哪些功能?  深圳网站制作培训,深圳哪些招聘网站比较好?  jQuery中的100个技巧汇总  ,网页ppt怎么弄成自己的ppt?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  EditPlus中的正则表达式 实战(1)  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  如何快速搭建虚拟主机网站?新手必看指南  详解Oracle修改字段类型方法总结  Android 常见的图片加载框架详细介绍  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  Laravel怎么判断请求类型_Laravel Request isMethod用法  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  在Oracle关闭情况下如何修改spfile的参数  Laravel如何实现用户密码重置功能?(完整流程代码)  laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  如何快速搭建高效服务器建站系统?  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  如何在IIS中新建站点并解决端口绑定冲突?  深圳网站制作的公司有哪些,dido官方网站?  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  网站页面设计需要考虑到这些问题  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  如何制作一个表白网站视频,关于勇敢表白的小标题?  如何在七牛云存储上搭建网站并设置自定义域名?  魔毅自助建站系统:模板定制与SEO优化一键生成指南