文章目录

  • 简介
  • ASCII字符的排序
  • 本地字符的排序
  • 为什么不使用unicode进行排序
  • emoji的正则匹配
  • 总结

简介

我们知道计算机最先兴起是在国外,出于当时计算机性能的考虑和外国常用字符的考虑,最开始计算机使用的是ASCII,ASCII编码能够表示的字符毕竟是有限的,随着计算机的发展和全世界范围的流行,需要更多的能够表示世界各地字符的编码方式,这种编码方式就是unicode。

当然在unicode出现之前,各个国家或者地区根据本国的字符需求都制定过本国的编码标准,当然这些编码标准都是本地化的,不适用于全世界,所以并没有得到普及。

今天我们来讨论一下unicode编码的字符进行排序和正则匹配的问题。

ASCII字符的排序

ASCII的全称叫做American Standard Code for Information Interchange,也就是美国信息交换标准代码,到目前为止,ASCII只有128个字符。这里不详细讨论ASCII字符的构成。感兴趣的同学可以查看我之前写的关于unicode的文章。

ASCII字符包含了26个字母,我们看下在javaScript中怎么对ASCII字符编码的:

const words = ['Boy', 'Apple', 'Bee', 'Cat', 'Dog'];
words.sort();
// [ 'Apple', 'Bee', 'Boy', 'Cat', 'Dog' ]

可以看到,这些字符是按照我们想要的字典的顺序进行排序的。

但是如果你将这些字符修改成中文,再进行排序,那么就得到的并不是我们想要的结果:

const words = ['爱', '我', '中', '华'];
words.sort();
// [ '中', '华', '我', '爱' ]

这是为什么呢?

其实默认的这种sort是将字符串转换成字节,然后按照字节进行字典顺序排序。如果是中文,那么并不会将其进行本地文字的转换。

本地字符的排序

既然使用ASCII字符不能对中文进行排序,那么我们其实是想将汉字转换为拼音,然后按照拼音字母的顺序来对其排序。

所以上面的”爱我中华“实际上是要比较”ai“、”wo“、”zhong“、”hua“ 这几个拼音的顺序。

有什么简单的方法来进行比较吗?

在一些浏览器中提供了Intl.Collator和String.prototype.localCompare两种方法来进行本地字符的比较。

比如我在chrome 91.0版本中:

使用Intl.Collator是可以得到结果的,而使用String.prototype.localCompare并不行。

再看下在firfox 89.0版本中:

结果和chrome是一致的。

下面是在nodejs v12.13.1版本的执行结果:

可以看到在nodejs中,并没有进行本地字符的转换和排序。

所以,上述的两个方法是和浏览器有关系的,也就是说和具体的实现是相关的。我们并不能完全对其信任。

所以,要给字符串进行排序是一件非常傻的事情!

为什么不使用unicode进行排序

那么为什么不使用unicode进行排序呢?

首先,对于普通用户来说,他们并不知道unicode,他们所需要的也就是将字符串转换为本地语言进行字典排序。

其次,即使使用本地字符进行排序也是非常困难的一件事情,因为浏览器需要对不同的语言进行本地化排序支持。这使得工作量变得巨大。

emoji的正则匹配

文章最后,我们来讲一下emoji的正则匹配问题。

emoji是一系列的表情,我们可以使用unicode来对其表示,但是emoji表情非常多,差不多有3521个,如果要对emoji进行正则匹配,我们需要写出下面的代码:

(?:\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83e\uddd1\ud83c\udffc|\ud83e\uddd1\ud83c\udffb\u200d\u2764\ufe0f\u200d\ud83d
[... 后面省略很多]

以一个图像来直观的看一下emoji表情有多少:

这么多的emoji,有没有简单的办法对其进行正则匹配呢?答案是有的。

早在ECMAScript的TC39提议里面,就已经把emoji的正则匹配加入了标准之中,我们可以使用{Emoji_Presentation}来表示。

\p{Emoji_Presentation}

是不是很简单?

总结

本文简单介绍了本地字符的排序规则和emoji表情的正则匹配。希望能够给大家在实际工作中带来帮助。

本文已收录于 http://www.flydean.com/04-unicode-sorting/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

开发小技巧之:unicode的排序和正则匹配相关推荐

  1. 一些Vue开发小技巧,让你开发更便捷

    Vue是一套用于构建用户界面的渐进式JavaScript框架.与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用.Vue的核心库只关注视图层,方便与第三方库或既有项目整合. 下面我们来看一些v ...

  2. MTK 手机开发小技巧(2)

    MMICheckDiskDisplay            开机点亮背光 PEN_CHECK_BOUND              检查触笔位置是否在控制区域 wgui_general_pen_do ...

  3. flex开发小技巧集锦

    关于flex开发网上有非常多的相关信息介绍,因此我们要想学习关于flex开发的知识信息技能是一件非常简单和方便的事情.而针对于flex开发小编要告诉大家的是一些flex开发小技巧.利用这些小技巧能够有 ...

  4. 日常安排php,PHP日常开发小技巧

    PHP日常开发小技巧 导语:PHP语言中,如果你懂得一些开发技巧,那么对你学PHP,会有很大的帮助.下面的是百分网小编为大家整理的PHP日常开发小技巧,希望对你能有所帮助. PHP批量取得checkb ...

  5. Silverlight 游戏开发小技巧:动感小菜单2

    Silverlight 游戏开发小技巧:动感小菜单2 动感小菜单其实是想模仿Apple的菜单按钮设计制作,但是画虎不成反类犬,看起来有点别扭,昨天各位园友提了这方面的建议,感觉太硬如果加入动画可能更好 ...

  6. Silve“.NET研究”rlight 游戏开发小技巧:传说中的透视跑马灯

    昨夜元宵佳节,各种灯会热闹非凡,伴随烟火灿烂好不热闹,可惜一点也没看着T_T,那就写一个跑马灯吧,可是跑马灯并不稀奇,各位高手们已经写过而且都各有特点,所以,写也要写点有特色的才好,游戏中经常能看到一 ...

  7. 一起谈.NET技术,Silverlight 游戏开发小技巧:动感小菜单

    网页应用受限于自身的浏览器范畴,不能把华丽效果完全展示,正是因为如此,在网页上诞生了无数绚丽的设计,虽然动感程度和桌面应用无法比拟,但是在UI上却下足了功夫,用户体验可以说无以伦比,比如说小小的菜单, ...

  8. Silverlight 游戏开发小技巧:轨迹跟随效果

    Silverlight 游戏开发小技巧:轨迹跟随效果 我们通常在游戏中有各种各样的粒子效果,其中有一种就是跟随鼠标发生的轨迹动画,在鼠标经过的地方会产生一些特效,这种方式我们在粒子当中经常使用,本篇使 ...

  9. Delphi三层开发小技巧:TClientDataSet的Delta妙用

    Delphi三层开发小技巧:TClientDataSet的Delta妙用 Delphi做三层开发时,很多人都会在客户端放一个TClientDataSet,中间层远程数据模块就对应放一个TDataSet ...

最新文章

  1. Centos7 搭建FastDFS文件管理系统及简单的迁移方法
  2. 代码雨代码源复制_超火!黑客帝国代码雨
  3. antd vue 多个下拉 联动_Antd下拉选择,自动匹配功能的实现
  4. mysql安装失败net_mysql安装后.net程序运行出错的解决方法
  5. 用JavaScript和HTML5创建文件上传器
  6. word如何一键全选_【众点学】学了这些Word技巧才知道,原来这么多年的班都白加了...
  7. linux/work
  8. javascript 3d engine ---m3d 公开
  9. 9 内存模型和名称空间
  10. SpringBoot启动后启动内嵌浏览器
  11. 达梦数据库工程师培训实战教程(主备集群、读写分离、共享集群)
  12. 完全干净卸载 iTunes 步骤
  13. xp升级到win7傻瓜教程_MeGUI教程-软件环境配置(转)
  14. nginx reopen
  15. 自动透视校正为四边形对象
  16. TDSQL携手金蝶云·苍穹,发布“国产数据库联合解决方案”
  17. linux 系统命令被后门修改_Linux、Windows权限维持常用后门学习总结
  18. python reverse方法和reversed方法的区别和使用
  19. Codeforces 757F: Team Rocket Rises Again(支配树)
  20. linux mailxdingding机器人报警

热门文章

  1. INLINE HOOK过驱动保护的理论知识和大概思路
  2. HeapAlloc与malloc的区别
  3. 第17讲:aiohttp 异步爬虫实战
  4. 经典面试|为何Kafka这么快?
  5. 摊牌了,我 HTTP 功底贼好!
  6. 日程解读 | LiveVideoStackCon 2020北京站日程官宣了!
  7. 音视频技术开发周刊 | 154
  8. 【WebRTC专场】WebRTC的下个10年,又会有怎样的惊喜?
  9. 腾讯云张贤国:北大将我从少年变成了技术研究者
  10. c++实现单例类(懒汉与饿汉)