资讯专栏INFORMATION COLUMN

汉字转拼音 支持20870个汉字,包含完整的多音字

cikenerd / 2986人阅读

摘要:如果转进制,则位进制只能表示个汉字,这个太少了。假设我们用个进制的字符,则可以表示,表示个汉字绰绰有余,但这时候需要多个字符。

项目地址:https://github.com/xinglie/pi...

压缩说明

为了便于在网络上的传输,本人想办法写了一个压缩算法,目前这个版本是压缩好的,带自解压功能
以下说明压缩思路:

理想状态下是使用Stirng.prototype.localCompare了,但是由于这玩意并不是所有浏览器实现都一样,例如chrome早期的就不是按拼音排序,所以这个方案先放一边

那网上最常见的就是码表了,比如{"a":"吖阿啊..."},这种形式的最可靠稳定,但唯一不足的是码表太大,汉字的范围最常用的在 u4e00-u9fa5 这个区间里,其它区间的暂不考虑。这个区间有20928个汉字(后来经我简单资料查找,发现这个区间里有些汉字并没有对应的拼音,也有些汉字无法正常显示,所以被我精简到了20870个汉字了,当然网上也有只把常用的几千个汉字做为码表的)。

现在的问题就来了,如果把这2w多个汉字做为码表存在js文件里无异是非常大的,我们需要想办法压缩,而在压缩前我们还有些问题需要解决:

如果存放js代码的文件用utf-8来保存,那如果这个js被放在了gbk编码的页面上,并且script标签未指定charset utf-8,那么这个js中的汉字是会乱码的,所以需要编码,常用的是unicode成{"a":"u5416u963fu554a..."},这样就不会有问题了。

如果用unicode编码,则2w多个汉字大概需要12w个字符表示(一个汉字6个字符)。如何用字符最少的来表示这些汉字成了压缩的关键

我们知道每个汉字都可以用charCodeAt取到相应的数字编码,也可以用String.fromCharCode进行还原,例如:"我".charCodeAt(0);//20105;我们也可以用String.fromCharCode(20105)还原成"我"字,OK,到这一步,最小汉字是19968;最大是40896。如果把所有汉字用数字表示,则只需要10w个字符即可,1个汉字对应5个数字(当然,直接把这5位数字转16进制,则只需要4个就可以,2w多个汉字大约8w个字符,仍然很多)。

到这一步后,我给自已一个目标:能否用2个字符表示一个汉字?如果可以,那么大概只需要4w多字符就可以表示完,这个压缩比对10w个字符还是相当可喜的。

既然再压缩,那就把刚才的 汉字的数字 20105再进行压缩,这时候我采取的是进制转换,比如把它转成64进制等尽可能大的进制。如果转64进制,则2位64进制只能表示4096个汉字,这个太少了。我需要自已写一个大的进制转换,我把ascii码表重新拿出来,128个字符,除了不显示的,我挑中了从33到126之间的这些字符(除34,45,92三个外,因为我需要把程序发布到网上,别人可以复制粘贴之类的,所以需要可视字符),一共91个。那么91进制2位数可表示91*91=8281个,仍然不够。

回头再看汉字的区间,19968-40896 如果每个汉字都减去19968,则区间变成0-20928,如果把这个区间一分为2:0-10464 10465-20928,第二个区间每个汉字减去10465 则变成0-10463,至此2个区间各有1w个汉字,离我们的91进制2位表示的8281比较接近了。

假设我们用3个91进制的字符,则可以表示753571,表示2w个汉字绰绰有余,但这时候需要6w多个字符。如果我们使用91进制的2个字符,每个区间共有2000多个无法被表示,如果剩余的这2000多个用3个字符表示,我们会发现这2000多个的高位一样(xyz),都是"x";那么这时候大概需要4w加上2个6000,大概5w2k个字符即可表示完成。

当然,我们要对3位的高位给一个特殊的字符,这样我们再还原的时候就很方便还原了,这不是难事,忽略不讲

至此,我们就完成了压缩,最后的js大约共58kb

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87973.html

相关文章

  • 汉字拼音

    摘要:多拼音格式输出支持支持多种拼音输出格式带音标不带音标数字表示音标以及拼音首字母输出格式常见多音字识别支持常见多音字的识别,其中包括词组成语地名等简繁体中文转换经对比以上三个类库,个人认为更加适合。 1、目前在百度或谷歌上搜索java汉字转拼音,主要有以下三种: 1)piny4j:搜索结果介绍文章最多的,然而此类库对生僻字支持不好,转换时会报空指针(java.lang.NullPoint...

    frank_fun 评论0 收藏0
  • 谈谈我做拼音搜索一点经验

    摘要:谈谈我做拼音搜索的一点经验需要注意的一些事情本文使用的为语言解决方案。当然也我们可以自己实现转换拼音的功能,如果这样做,则需要在代码中设定好中文字库和对应的拼音,同时特别注意多音字的处理。 谈谈我做拼音搜索的一点经验 需要注意的一些事情 本文使用的为 Java 语言解决方案。 搜索方法上,按照个人理解,有两点关键: 分词 将类似 women 这样的词分解成 women。经过这...

    Eastboat 评论0 收藏0
  • 前端周刊第40期

    摘要:注意本文为前端周刊早期整理的旧文重发,不过大部分内容并没有过时,已经看过的同学可以直接去文末订阅前端周刊微信公众号。想和我面对面交流扫下方二维码添加我为好友。 注意:本文为前端周刊早期整理的旧文重发,不过大部分内容并没有过时,已经看过的同学可以直接去文末订阅前端周刊微信公众号。 文章教程 号外:ES6 模块语法已定稿 www.2ality.com ES6 模块语法已定稿,和之前所看到的...

    Carbs 评论0 收藏0
  • PHP汉字拼音

    摘要:最简单最准确的中文转拼音的类项目地址支持获取拼音以及拼音的缩写即首字母支持等编码能准确匹配千多个常用汉字单个汉字,一句话,中英文混合都完美支持例子版早上好获取拼音早上好获取拼音缩写例子版早上好获取拼音早上好获取拼音缩写 最简单、最准确的PHP中文转拼音的类 github项目地址:https://github.com/jifei/Pinyin 支持获取拼音以及拼音的缩写即首字母 ...

    tulayang 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<