简介
咱们晓得计算机最先衰亡是在国外,出于过后计算机性能的思考和外国罕用字符的思考,最开始计算机应用的是 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/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!