简介

我们知道计算机最先兴起是在国外,出于当时计算机性能的考虑和外国常用字符的考虑,最开始计算机使用的是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. PHP开发小技巧②—实现二维数组根据key进行排序

    在PHP中内置了很多对数组进行处理的函数,有很多时候我们直接使用其内置函数就能达到我们的需求,得到我们所想要的结果:但是,有的时候我们却不能通过使用内置函数实现我们的要求,这就需要我们自己去编写算法来 ...

  2. flex开发小技巧集锦

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

  3. Windows统一平台: 开发小技巧

    Windows统一平台: 开发小技巧 技巧一: 在手机端拓展你应用的显示区域.(WP8.1中也适用) 对于Windows Phone系统的手机, 手机屏幕最上方为系统状态栏(System Tray), ...

  4. TP开发小技巧

    TP开发小技巧原文地址http://wp.chenyuanzhao.com/wp/2016/07/23/tp%E5%BC%80%E5%8F%91%E5%B0%8F%E6%8A%80%E5%B7%A7/ ...

  5. 移动Web开发小技巧

    移动Web开发小技巧 添加到主屏后的标题(IOS) name="apple-mobile-web-app-title" content="标题"> 启用  ...

  6. BizTalk开发小技巧

    BizTalk开发小技巧 随笔分类 - Biztalk Biztalk 使用BizTalk实现RosettaNet B2B So Easy 摘要: 使用BizTalk实现RosettaNet B2B ...

  7. Java开发小技巧(三):Maven多工程依赖项目

    前言 本篇文章基于Java开发小技巧(二):自定义Maven依赖中创建的父工程project-monitor实现,运用我们自定义的依赖包进行多工程依赖项目的开发. 下面以多可执行Jar包项目的开发为例 ...

  8. iOS开发小技巧 - UILabel添加中划线

    iOS开发小技巧 遇到的问题: 给Label添加中划线,然后并没有效果 NSString *str = [NSString stringWithFormat:@"合计金额 ¥%.2f&quo ...

  9. PHP开发小技巧③—实现多维数组转化为一维数组

    在平常的项目开发中我们多会用到让多维数组转化为一维数组的情况,但是很多Programmer不会将其进行转化,也有些没有想到很好的算法然后经过乱起八糟的运算方式将其勉强转化好,但是所写的程序代码冗余非常 ...

随机推荐

  1. golang:TCP总结

    在TCP/IP协议中,"IP地址+TCP或UDP端口号"唯一标识网络通讯中的一个进程."IP地址+端口号"就对应一个socket.欲建立连接的两个进程各自有一个 ...

  2. [Linux] Shell请求网页

    文件描述符 0:标准输入 1:标准输出 2:报错输出 举例 1 exec 8<> /dev/tcp/www.baidu.com/80 2 echo -e "GET / HTTP/ ...

  3. 所有的 Unix Like 系统都会内建 vi 文书编辑器。vim 是vi的升级版本,它不仅兼容vi的所有指令 ,而且还有一些新的特性在里面。

    所有的 Unix Like 系统都会内建 vi 文书编辑器.vim 是vi的升级版本,它不仅兼容vi的所有指令 ,而且还有一些新的特性在里面. https://blog.csdn.net/carolz ...

  4. 利用S3fs在Amazon EC2 Linux实例上挂载S3存储桶

    一.准备!!! 1.使用拥有足够权限的IAM账号登录AWS控制台 2.创建S3存储桶,给存储桶命名如"my-bucket"(如果使用已有存储桶,本步骤可略过) 3.有该S3存储桶访 ...

  5. k8s 管理存储资源(10)

    一.Kubernetes 如何管理存储资源 理解Volume 我们经常会说:容器和 Pod 是短暂的. 其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据 ...

  6. IT菜鸟之计算机软件

     一.计算机系统的分类 32位操作系统:32/u:更省资源:支持4G以内的内存 64位操作系统:64/u:速度更快:支持4G以外的内存 内存单位:B KB MB GB TB 换算:1024(2的10次 ...

  7. 9.11 strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数

    strace 是Linux环境下的一款程序调试工具,用于检查一个应用程序所使用的系统调用以及它所接收的系统信息.strace会追踪程序运行时的整个生命周期,输出每一个系统调用的名字.参数.返回值和执行 ...

  8. 多条件分页 (Day_31)

    接我的上篇博客  EasyUI_使用datagrid分页 (Day_28) . 按惯例,我们先看效果图 EasyUI 实现多条件分页很简单. 我们先来通过官网了解下这两个属性: 显然,有了load 方 ...

  9. Python中PyQuery库的使用

    pyquery库是jQuery的Python实现,可以用于解析HTML网页内容,我个人写过的一些抓取网页数据的脚本就是用它来解析html获取数据的. 它的官方文档地址是:http://packages ...

  10. 在命令行模式下查看Python帮助文档---dir、help、__doc__

    在命令行模式下查看Python帮助文档---dir.help.__doc__   1.dir函数式可以查看对象的属性,使用方法很简单,举str类型为例,在Python命令窗口输入 dir(str) 即 ...