美文网首页Java区块链大学程序那些事
开发小技巧之:unicode的排序和正则匹配

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

作者: flydean程序那些事 | 来源:发表于2021-07-06 08:54 被阅读0次

简介

我们知道计算机最先兴起是在国外,出于当时计算机性能的考虑和外国常用字符的考虑,最开始计算机使用的是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版本中:

image

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

再看下在firfox 89.0版本中:

image

结果和chrome是一致的。

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

image

可以看到在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表情有多少:

image

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

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

\p{Emoji_Presentation}

是不是很简单?

总结

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

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

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

相关文章

  • 开发小技巧之:unicode的排序和正则匹配

    简介 我们知道计算机最先兴起是在国外,出于当时计算机性能的考虑和外国常用字符的考虑,最开始计算机使用的是ASCII...

  • regrex扩展

    正则的扩展 u修饰符 支持unicode字符匹配.字符能匹配unicode字符unicode字符表示法\u{}量词...

  • 正则匹配中文字符

    正则匹配中文字符,使用unicode编码: 用正则表达式限制只能输入中文:onkeyup="value=value...

  • 正则表达式使用规则

    1.单个字符的匹配规则如下: 正则表达式规则可以匹配A指定字符A\u548c指定Unicode字符和.任意字符a,...

  • python正则匹配

    python正则匹配规则和一个小实例 python正则匹配规则 正则小栗子 获取一个页面的网页信息 比如我要获取简...

  • RegExp Cheatsheet

    正则匹配技巧 使用python包re 基本函数 re.match(正则表达式, 原字符串) 从最开始匹配,但只匹配...

  • JavaScript 正则匹配的 Unicode 模式

    疑惑的 unicode 模式 前两天室友正在看 js 关于正则表达式的博客,发现 js 正则表达式中有个 u,可以...

  • 正则表达式匹配规则

    本文介绍的并不是正则表达式的通配符含义,或者一些正则的书写技巧而是介绍正则匹配的流程,正则进行匹配的规则 1.首先...

  • Python 正则表达式1 - 正则介绍

    正则表达式 re模块提供了与Perl语言类似的正则表达式匹配操作模式和被搜索的字符串既可以是Unicode字符串(...

  • re-正则表达式

    简介 这个模块提供了与 Perl 语言类似的正则表达式匹配操作。 模式和被搜索的字符串既可以是 Unicode 字...

网友评论

    本文标题:开发小技巧之:unicode的排序和正则匹配

    本文链接:https://www.haomeiwen.com/subject/etgwultx.html