广告
返回顶部
首页 > 资讯 > 前端开发 > html >JavaScript如何实现汉字转拼音
  • 491
分享到

JavaScript如何实现汉字转拼音

2024-04-02 19:04:59 491人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关javascript如何实现汉字转拼音,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.汉字转拼音的现状首先应该说,汉字转拼音是个强需求,比如

这篇文章将为大家详细讲解有关javascript如何实现汉字转拼音,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

一.汉字转拼音的现状

首先应该说,汉字转拼音是个强需求,比如联系人按拼音字母排序/筛选;比如目的地(典型如机票购买)
按拼音首字母分类等等。但是这个需求的解决方案,但好像没听过什么巧妙的实现(特别是浏览器端),大概都需要一个庞大的字典。
具体到JavaScript,查查GitHub和npm,比较优秀的处理汉字转拼音的库有pinyin
和pinyinjs,可以看到,两者都自带了庞大的字典。
这些字典动辄几十上百KB(有的甚至几MB),想在浏览器端使用还是需要一些勇气的。所以当我们碰到汉字转拼音的需求,也不怪我们第一反应就是拒绝需求(或者服务端实现)。
现在,如果我告诉你可以浏览器端300行代码实现汉字转拼音,是不是不可置信?

二.从安卓4.2.2联系人代码说起

再次强调这篇博客——利用Android源码,轻松实现汉字转拼音功能。
今天和大家分享一个从Android系统源代码提取出来的汉字转成拼音实现方案,只要一个类,560多行代码就可以让你轻松实现汉字转成拼音的功能,且无需其他任何第三方依赖。
是不是打破了你的思维定势:难道有什么强大的算法可以抛弃字典?
第一遍看完博客,稍有些失望,并没有什么算法解析,只是介绍了从安卓代码发现的这几百行代码。第二遍时带着移植到JavaScript的想法阅读代码,算是弄懂了原理,于是开始了踩坑的移植之旅。

三.手把手教你300行JavaScript代码实现汉字转拼音

首先直指核心:为什么有汉字转拼音必须有庞大字典的思维定势?
因为汉字的排布和拼音并有什么关联,比如在汉字区间\u4E00-\u9FFF,前一个可能是ha,后一个可能就是ze,没有办法从汉字的unicode关联到拼音,所以只能有一个庞大的字典记录每个汉字(或常用汉字)的拼音。
但是,假设我们可以把所有汉字按拼音排序,比如按'A','ai','AN','ANG','AO','BA',...,'ZUI','ZUN','ZUO'排序,那么,我们只需要记住每个相同拼音的汉字队列的第一个汉字就好了。那么,所需要的字典就会很小(覆盖所有拼音即可,拼音数量本身不多)。
现在,难点就是把汉字按拼音排序了。很幸运,ICU/本地化相关的api提供了这个排序API(如果没有方便的排序/比较方法,那么本篇文章可能就不会出现了)。

所以,这就是为什么300行可以实现汉字转拼音:Intl.CollatorAPI:Intl.Collator内部实现了本土化相关的字符串排序。我们通过Intl.Collator.prototype.compare可以把所有汉字基本按照拼音来排序。
边界汉字表:记录了排序的边界点。该汉字表的每个汉字都是排序后相同拼音的汉字集合的首个汉字(Eachunihansisthefirstonewithinsamepinyinwhencollatoriszh_CN)。
说到这里,可能仍然有没说清楚的地方,所以直接上一段代码:

 JavaScript如何实现汉字转拼音

JavaScript如何实现汉字转拼音

有兴趣的同学可以执行node--icu-data-dir=node_modules/full-icu上面的脚本.js看看,然后看看是不是得到了基本按照拼音排序的汉字表。

这里有几点要注意:

我再次加粗了“基本”,因为我们得到的汉字列表并没有完全按照拼音来排序,中间偶尔有一些其它拼音的汉字插入,这点在制作边界表时要额外注意。
上面脚本里得出的表是所有汉字的排序,其中有些和安卓代码里HanziToPinyin.java的表有不同,所以需要更新HanziToPinyin.java的表。(从Java转到JavaScript的最大的坑和工作量:更正边界表)
相信大家都看到了核心代码:constCOLLATOR=newIntl.Collator(['zh-Hans-CN']),Intl.Collator
(这里指定locale是中国zh-Hans-CN)正是能把汉字按拼音排序的关键,它是按locale-specific顺序,排序字符串的InternationalizationAPI。
执行脚本时请先npmifull-icu,这个依赖会自动安装缺失的中文支持并提示如何指定ICU数据文件来执行脚本。
1.ICUICU即InternationalComponentsforUnicode,为应用提供Unicode和国际化支持。
ICUisamature,widelyusedsetofC/C++andJavalibrariesprovidingUnicodeandGlobalizationsupportforsoftwareapplications.ICUiswidelyportableandgivesapplicationsthesameresultsonallplatfORMsandbetweenC/c++andJavasoftware.
并且ICU提供了本地化字符串比较服务(UnicodeCollationAlGorithm+本地特定的比较规则):
Collation:Comparestringsaccordingtotheconventionsandstandardsofaparticularlanguage,regionorcountry.ICU'scollationisbasedontheUnicodeCollationAlgorithmpluslocale-specificcomparisonrulesfromtheCommonLocaleDataRepository,acomprehensivesourceforthistypeofdata.
在现代浏览器上,一般ICU内置了对用户本地语言的支持,我们直接使用即可。
但对node.js来说,通常情况下,ICU只包含了一个子集(通常是英语),所以我们需要自行添加对中文的支持。一般来说,可以通过npminstallfull-icu安装full-icu
来安装缺失的中文支持。(参见上面node--icu-data-dir=node_modules/full-icu)。
2.IntlAPI上一小节应该基本讲清楚了国际化/本地化相关的知识,这里再补充一下内置API的使用。怎么查看用户语言和Runtime是否支持这个语言?Intl.Collator.supportedLocalesOf(array|string)
返回包含支持(不用回退到默认locale)的locales的数组,参数可以是数组或字符串,为想要测试的locales(即BCP47languagetag)。

JavaScript如何实现汉字转拼音

构造Collator对象和排序字符串

JavaScript如何实现汉字转拼音

通过Intl.Collator.prototype.compare,我们可以按语言指定的顺序来排序字符串。而中文中,这个排序恰好绝大多数都是按拼音的顺序来的,'A','AI','AN','ANG','AO','BA','BAI','BAN','BANG','BAO','BEI','BEN','BENG','BI','BIAN','BIAO','BIE','BIN','BING','BO','BU','CA','CAI','CAN',...
,这正是我们上面提到的汉字转拼音的关键。

四.边界表更正

JavaScript如何实现汉字转拼音

 显然,这个边界表是有问题的,需要更正。
我们可看到,大部分的汉字被转成了qing,可见,qing这个拼音对应的汉字有问题。
找到这个汉字,是'\u72c5'/'狅',加上前后各一个字,['\u4eb2','\u72c5','\u828e']/["亲","狅","芎"]

搜索,'\u72c5'/'狅'可以读qing,但现在多读kuang,这应该就是错误的原因了。
根据最初得到那张所有汉字的排序表,qing的第一个汉字是'\u9751'/'靑'。
改动后,转换失败的只剩104了。

 JavaScript如何实现汉字转拼音

关于“JavaScript如何实现汉字转拼音”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: JavaScript如何实现汉字转拼音

本文链接: https://www.lsjlt.com/news/76342.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript如何实现汉字转拼音
    这篇文章将为大家详细讲解有关JavaScript如何实现汉字转拼音,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一.汉字转拼音的现状首先应该说,汉字转拼音是个强需求,比如...
    99+
    2022-10-19
  • js怎么实现汉字转拼音
    在JavaScript中,可以使用第三方库 `pinyin` 来实现汉字转拼音的功能。可以使用 `npm` 来安装该库,然后在项目中...
    99+
    2023-08-19
    js
  • C#实现汉字转拼音(多音字)功能详解
    缘由:根据姓名创建账号,存在生僻字以及多音字 做法:自己根据网上信息自己写了类,词库可能不完整(有待补充) 其他不多说了,先上代码如下: using System; using Sy...
    99+
    2023-02-15
    C#实现汉字转拼音 C#汉字转拼音 C# 汉字 拼音
  • 如何用js实现汉字转拼音的效果
    要实现汉字转拼音的效果,可以使用第三方库 pinyin.js。以下是一个示例:1. 在页面中引入 pinyin.js:```html...
    99+
    2023-08-18
    JS
  • C#实现汉字转汉语拼音的示例代码
    目录一、使用PinYinConverterCore获取汉语拼音二、编写工具扩展类实现获取汉字的拼音三、编写测试用例一、使用PinYinConverterCore获取汉语拼音 最新在做...
    99+
    2022-11-13
  • android实现汉字转拼音功能 带多音字识别
    android 汉字转拼音带多音字识别功能,供大家参考,具体内容如下 问题来源 在做地名按首字母排序的时候出现了这样一个bug。长沙会被翻译拼音成zhangsha,重庆会被...
    99+
    2022-06-06
    转拼音 Android
  • jQuery如何实现QQ空间汉字转拼音功能
    这篇文章主要介绍了jQuery如何实现QQ空间汉字转拼音功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体如下:html:<!DO...
    99+
    2022-10-19
  • C# 汉字与拼音互转的实现示例
    这个功能,大家也都可以去百度以下,千篇一律都自己写的(抄的)封装好的公共类,此处还是得膜拜下原创的大佬,可以花时间去搞这个,我看着都头皮发麻。 对于一个有代码洁癖的码农来说,我并不喜...
    99+
    2022-11-13
  • php汉字转拼音函数的实现方法
    本文将为大家详细介绍“php汉字转拼音函数的实现方法”,内容步骤清晰详细,细节处理妥当,而小编每天都会更新不同的知识点,希望这篇“php汉字转拼音函数的实现方法”能够给你意想不到的收获,请大家跟着小编的思路慢慢深入,具体内容如下,一起去收获...
    99+
    2023-06-06
  • Java实现汉字转拼音,多音字处理,简单明了
    背景: 之前一直是前端直接调用公司公共城市组件获取城市列表,现在由于公共组件不再支持,需要由后端接口提供城市查询,并且按照城市首字母分组展示。 后端实现: 最开始选择pinyin4j来实现,但发现对多音字的处理不太友好,比如需要转重庆的拼音...
    99+
    2023-09-25
    java 开发语言 mysql
  • 详解如何利用C#实现汉字转拼音功能
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2022-12-23
    C#汉字转拼音 C# 汉字 拼音
  • 教你使用Python pypinyin库实现汉字转拼音
    一、前言 这里我先为大家提供一个中文网站,大家可以下去更深入的学习。 https://pypi.org/project/pypinyin/ pypinyin库,主要有几下几个特性: 智能匹配最正确的拼音;...
    99+
    2022-06-02
    pypinyin库汉字转拼音 Python pypinyin库
  • 怎么使用Python pypinyin库实现汉字转拼音
    这篇文章主要介绍了怎么使用Python pypinyin库实现汉字转拼音,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言pypinyin库,主要有几下几个特性:智能匹配...
    99+
    2023-06-15
  • android项目中如何将汉字转换为拼音
    android项目中如何将汉字转换为拼音?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码如下 private int getChsAscii(String ch...
    99+
    2023-05-31
    android roi 目中
  • 基于Python实现简单的汉字拼音转换工具
    目录1.准备2.基本使用3.高级使用将汉字转为拼音,可以用于批量汉字注音、文字排序、拼音检索文字等常见场景。 现在互联网上有许多拼音转换工具,基于Python的开源模块也不少,今天给...
    99+
    2022-11-11
  • sqlserver实现获取汉字助记码功能汉字拼音字母
    --01--首先创建一个函数,其功能就是功能是得到汉字拼音首字母 go if exists (select * from sysobjects where name='fun_g...
    99+
    2022-10-18
  • Java中如何实现汉字生成拼音首拼和五笔码
    这篇文章主要介绍Java中如何实现汉字生成拼音首拼和五笔码,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!汉字生成拼音首拼和五笔码最近要开始新的项目了,在需求报告中看到有需要生成拼音首拼和五笔码的需求,我也在网上找了很...
    99+
    2023-06-29
  • vue+iview如何实现拼音、首字母、汉字模糊搜索
    目录先看效果图解决思路页面结构校验规则远程搜索方法表单submit提交方法的传参中最近项目做的后台管理系统中,要求实现一个支持拼音、首字母和汉字模糊搜索的下拉框。项目是用vue+iv...
    99+
    2022-11-13
  • Java中实现汉字生成拼音首拼和五笔码
    目录汉字生成拼音首拼和五笔码拼音首拼五笔码利用pinyin4j实现汉字转拼音汉字生成拼音首拼和五笔码 最近要开始新的项目了,在需求报告中看到有需要生成拼音首拼和五笔码的需求,我也在网...
    99+
    2022-11-13
  • mysql中如何按照汉字拼音排序
    mysql中实现按照汉字的拼音进行排序的方法首先,在命令行中启动MySQL服务;service mysql start  MySQL服务启动后,在命令行中输入mysql的用户名和密码登录到MySQL;mysql -u root -p登录到M...
    99+
    2022-10-19
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作