天天看點

開發小技巧之:unicode的排序和正則比對

簡介

ASCII字元的排序

本地字元的排序

為什麼不使用unicode進行排序

emoji的正則比對

總結

我們知道計算機最先興起是在國外,出于當時計算機性能的考慮和外國常用字元的考慮,最開始計算機使用的是ASCII,ASCII編碼能夠表示的字元畢竟是有限的,随着計算機的發展和全世界範圍的流行,需要更多的能夠表示世界各地字元的編碼方式,這種編碼方式就是unicode。

當然在unicode出現之前,各個國家或者地區根據本國的字元需求都制定過本國的編碼标準,當然這些編碼标準都是本地化的,不适用于全世界,是以并沒有得到普及。

今天我們來讨論一下unicode編碼的字元進行排序和正則比對的問題。

ASCII的全稱叫做American Standard Code for Information Interchange,也就是美國資訊交換标準代碼,到目前為止,ASCII隻有128個字元。這裡不詳細讨論ASCII字元的構成。感興趣的同學可以檢視我之前寫的關于unicode的文章。

ASCII字元包含了26個字母,我們看下在javaScript中怎麼對ASCII字元編碼的:

可以看到,這些字元是按照我們想要的字典的順序進行排序的。

但是如果你将這些字元修改成中文,再進行排序,那麼就得到的并不是我們想要的結果:

這是為什麼呢?

其實預設的這種sort是将字元串轉換成位元組,然後按照位元組進行字典順序排序。如果是中文,那麼并不會将其進行本地文字的轉換。

既然使用ASCII字元不能對中文進行排序,那麼我們其實是想将漢字轉換為拼音,然後按照拼音字母的順序來對其排序。

是以上面的”愛我中華“實際上是要比較”ai“、”wo“、”zhong“、”hua“ 這幾個拼音的順序。

有什麼簡單的方法來進行比較嗎?

在一些浏覽器中提供了Intl.Collator和String.prototype.localCompare兩種方法來進行本地字元的比較。

比如我在chrome 91.0版本中:

開發小技巧之:unicode的排序和正則比對

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

再看下在firfox 89.0版本中:

開發小技巧之:unicode的排序和正則比對

結果和chrome是一緻的。

下面是在nodejs v12.13.1版本的執行結果:

開發小技巧之:unicode的排序和正則比對

可以看到在nodejs中,并沒有進行本地字元的轉換和排序。

是以,上述的兩個方法是和浏覽器有關系的,也就是說和具體的實作是相關的。我們并不能完全對其信任。

是以,要給字元串進行排序是一件非常傻的事情!

那麼為什麼不使用unicode進行排序呢?

首先,對于普通使用者來說,他們并不知道unicode,他們所需要的也就是将字元串轉換為本地語言進行字典排序。

其次,即使使用本地字元進行排序也是非常困難的一件事情,因為浏覽器需要對不同的語言進行本地化排序支援。這使得工作量變得巨大。

文章最後,我們來講一下emoji的正則比對問題。

emoji是一系列的表情,我們可以使用unicode來對其表示,但是emoji表情非常多,差不多有3521個,如果要對emoji進行正則比對,我們需要寫出下面的代碼:

以一個圖像來直覺的看一下emoji表情有多少:

開發小技巧之:unicode的排序和正則比對

這麼多的emoji,有沒有簡單的辦法對其進行正則比對呢?答案是有的。

早在ECMAScript的TC39提議裡面,就已經把emoji的正則比對加入了标準之中,我們可以使用{Emoji_Presentation}來表示。

是不是很簡單?

本文簡單介紹了本地字元的排序規則和emoji表情的正則比對。希望能夠給大家在實際工作中帶來幫助。

本文已收錄于 http://www.flydean.com/04-unicode-sorting/ 最通俗的解讀,最深刻的幹貨,最簡潔的教程,衆多你不知道的小技巧等你來發現!

繼續閱讀