• 背景
    因最近做模糊搜索功能,需要支持拼音、首字母、大小写搜索。所以网上翻了很多汉字转拼音的例子,大多数都只是贴了代码,没有讲具体原理。后来博主各处搜索,找到了几处解释。现将这些内容统一整理到一处。便于需要的人和自己以后拿来复用。

    本文主要介绍汉字转拼音的实现。首字母的实现请参照汉字转首字母字符串。以后有精力我也会补充一篇汉字转首字母原理的讲解。汉字转拼音的处理主要有以下两种思路。

    1. 根据编码范围确定汉字拼音。此方法的弊端是一些生僻字无法处理,比如:“囧”。无法转换出声调。
    2. 利用字库,查找汉字拼音。可用本地字库,也可以从网站抓取数据。

    本文讲解的是第一种方式的实现。关于第二种可参考汉字转拼音终结篇。

  • 原理
    根据编码范围确定汉字拼音。这里我用的是gb2312编码。由于区位码与汉字一一对应。所以我们可以根据区位码找到对应的汉字。因gb2312的第16-55区是按拼音顺序排列的一级汉字(比较常用的汉字)。所以用范围可以确定一级汉字的拼音,如区位码在[1601, 1603)集合,拼音为a;区位码在[1603,1616)集合,拼音为ai。而gb2312的第56-87区是按偏旁部首排列的二级汉字(不常用的汉子),我们就无法用范围确定一个字的拼音。只能列举出区位码对应的拼音。形如:

    case 6325:
    case 6436:
    case 7571:
    case 7925:value = "a";break; 

    幸好这一部分已有现成代码,不需要我们对应gb2312的编码表按区位码自己写一套。若不了解区位码与gb2312的编码表可能看起来有点懵。以下转载这部分的知识。

    1. gb2312

      GB2312编码包括符号、数字、字母、日文、制表符等,当然最主要的部分还是中文,它采用16位编码方式,简体中文的编码范围从B0A1一直到F7FE,完整编码表可以参考http://ash.jp/code/cn/gb2312tbl.htm。

    2. 区位码(引用自百度百科)

      GB2312是一个简体中文字符集,由6763个常用汉字和682个全角的非汉字字符组成。其中汉字根据使用的频率分为两级。一级汉字3755个,二级汉字3008个。由于字符数量比较大,GB2312采用了二维矩阵编码法对所有字符进行编码。首先构造一个94行94列的方阵,对每一行称为一个“区”,每一列称为一个“位”,然后将所有字符依照下表的规律填写到方阵中。这样所有的字符在方阵中都有一个唯一的位置,这个位置可以用区号、位号合成表示,称为字符的区位码。如第一个汉字“啊”出现在第16区的第1位上,其区位码为1601。因为区位码同字符的位置是完全对应的,因此区位码同字符之间也是一一对应的。这样所有的字符都可通过其区位码转换为数字编码信息。GB2312字符的排列分布情况见下表。

      分区范围 符号类型
      第01区 中文标点、数学符号、以及一些特殊字符
      第02区 各种各样的数学序号
      第03区 全角西文字符
      第04区 日文平假名
      第05区 日文片假名
      第06区 希腊字母表
      第07区 俄文字母表
      第08区 中文拼音字母表
      第09区 指标符号
      第10-15区 无字符
      第16-55区 一级汉字(以拼音字母排序)
      第56-87区 二级汉字(以部首笔画排序)
      第88-94区 无字符

      GB2312字符在计算机中存储是以其区位码为基础的,其中汉字的区码和位码分别占一个存储单元,每个汉字占两个存储单元。由于区码和位码的取值范围都是在1-94之间,这样的范围同西文的存储表示冲突。例如汉字‘珀’在GB2312中的区位码为7174,其两字节表示形式为71,74;而两个西文字符‘GJ’的存储码也是71,74。这种冲突将导致在解释编码时到底表示的是一个汉字还是两个西文字符将无法判断。
      为避免同西文的存储发生冲突,GB2312字符在进行存储时,通过将原来的每个字节第8bit设置为1同西文加以区别,如果第8bit为0,则表示西文字符,否则表示GB2312中的字符。实际存储时,采用了将区位码的每个字节分别加上A0H(160)的方法转换为存储码,计算机存储规则是此编码的补码,而且是位码在前,区码在后。例如汉字‘啊’的区位码为1601,其存储码为B0A1H,其转换过程为:

      区位码 区码转换 位码转换
      1001H 10H+A0H=B0H 01H+A0H=A1H

      GB2312编码用两个字节(8位2进制)表示一个汉字,所以理论上最多可以表示256×256=65536个汉字。但这种编码方式也仅仅在中国行得通,如果您的网页使用的GB2312编码,那么很多外国人在浏览你的网页时就可能无法正常显示,因为其浏览器不支持GB2312编码。当然,中国人在浏览外国网页(比如日文)时,也会出现乱码或无法打开的情况,因为我们的浏览器没有安装日文的编码表。

      因存储码是在区码和位码的基础上加A0H。所以我们在取得的字符若在[0, 160]之间就可以认为是英文。

至于“囧”字等生僻字无法解析的问题。是由于gb2312是1980年编码完成的,当时还没有”囧”字。所以编码中根本就不存在这个字导致的。

  • 实现
    具体代码实现参照C++ 将汉字转换成拼音全拼

汉字转拼音的C++实现及原理_gb2312区位码篇相关推荐

  1. php 获取 拼音,php根据汉字获取拼音(php基于拼音搜索实现原理)

    php根据汉字获取拼音(php基于拼音搜索实现原理) 代码一:获取字符串汉字首字母,兼容GBK和UTF-8<?php function getfirstchar($s0){ //获取单个汉字拼音 ...

  2. 汉字转换拼音字头原理实践

    今天照常登陆php新闻网站,看到首页的一则文字类的新闻,汉字转换拼音字头原理,闲来无事,用php实践下,把它写出来 /** * 汉字转换为拼音字头 * @author jkj */ class HzT ...

  3. java 汉字转拼音原理_java 汉字转拼音

    最近在项目中有需求将汉字转拼音,找到了相关资料,整理如下 /* * @1 版本说明: 2013-07-27 pj add * * @2 函数说明:返回字符串的全拼 */ public static S ...

  4. 汉字转换为拼音字头的工具类与原理

    基础知识 GB 2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个. 分区表示 GB 2312中对所收汉字进行了"分区"处理,每区含有94个汉字/符号.这 ...

  5. 汉字转拼音,中文拼音排序器

    汉字转拼音 NSMutableString *ms = [[NSMutableString alloc] initWithString:@"我是中国人"]; if (CFStrin ...

  6. 【推荐】iOS汉字转拼音第三方库

    PinYin4Objc是一个在git汉字转拼音的开源库,支持简体和繁体中文.效率POAPinyin等其他库要高,转换库也完整下面简单介绍 实现原理 使用unicode_to_hanyu_pinyin. ...

  7. 汉字转拼音(c#) -转载

    /**//// <summary>         /// 根据汉字拼音排序得到首字母         /// </summary>         /// <param ...

  8. PHP实现汉字转拼音

    用PHP实现汉字转拼音,网上有很多方法,其实主要还是编码的转换,基本的实现原理都是先找到汉字对应的ASK码,然后将得到的ASK码与事先建立的拼音字母ASK码字典遍历匹配,找到对应的拼音字母,所以是否可 ...

  9. 程序实现汉字转换为拼音

    做了一个讯飞语音识别的项目,API返回的识别结果是汉字格式.需要提取关键字与数据库中的数据进行匹配,为提高数据的识别率.考虑到需要将数据库中的文字和识别后的数据转换为拼音的形式进行匹配.但也没找到相关 ...

最新文章

  1. Qt5官方demo分析集29——Extending QML - Property Value Source Example
  2. php include效率分析
  3. bat脚本调用函数 简单列子
  4. SQL SELECT DISTINCT 语句 用法
  5. 另一种绕过 Android P以上非公开API限制的办法
  6. 应用程序自动更新组件GeneralUpdate3.2.1发布
  7. mongodb 持久性_多语言持久性:带有MongoDB和Derby的EclipseLink
  8. 一个分布式服务器集群架构方案
  9. Nginx - 配置
  10. python qt gui快速编程 pdf_翻译:《用python和Qt进行GUI编程》——介绍
  11. 获取GridView的BoundField值
  12. java 高级笔试题_JAVA高级工程师笔试题及答案
  13. 代码生成器 Freemaker
  14. apk java反编译_【Apk反编译】如何反编译Apk得到Java源代码
  15. [转]“新欢乐时光”病毒源代码分析
  16. shardingsphere5.0 解决第一次执行sql慢的问题
  17. windows系统解决程序端口号被占用
  18. vue异步获取图片流文件进行图片显示
  19. php跳水比赛,2018年“迎春杯”海南省青少年健身游泳比赛成功举行 前奥运跳水冠军许艳梅见证海南游泳健儿风采...
  20. 面对充电桩万亿“蛋糕”的诱惑,OPPO心动了?

热门文章

  1. 中国创业的孵化器和加速器
  2. 准备Scrum之旅 之 Hello,温哥华——《轻松Scrum之旅》(16)
  3. JavaScript案例之电影院电子选票
  4. avoid mutating a prop directly since the value will be overwritten whenever完美解决
  5. 苹果被曝重大系统漏洞:新款MacBook、iPhone 12统统波及,root权限秒被获取
  6. js 获取汉字首拼和全拼和拼音
  7. 完善circos做图
  8. 网站设计新趋势:沉浸式交互设计
  9. 棠玥寕近照曝光,淡雅着装,盖不住魅力
  10. 浏览器安全——Web页面安全浏览器网络安全(HTTPS)浏览器系统安全