日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2024/2/28 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开发小技巧之:unicode的排序和正则匹配 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • ASCII字符的排序
  • 本地字符的排序
  • 為什么不使用unicode進(jìn)行排序
  • emoji的正則匹配
  • 總結(jié)

簡介

我們知道計算機(jī)最先興起是在國外,出于當(dāng)時計算機(jī)性能的考慮和外國常用字符的考慮,最開始計算機(jī)使用的是ASCII,ASCII編碼能夠表示的字符畢竟是有限的,隨著計算機(jī)的發(fā)展和全世界范圍的流行,需要更多的能夠表示世界各地字符的編碼方式,這種編碼方式就是unicode。

當(dāng)然在unicode出現(xiàn)之前,各個國家或者地區(qū)根據(jù)本國的字符需求都制定過本國的編碼標(biāo)準(zhǔn),當(dāng)然這些編碼標(biāo)準(zhǔn)都是本地化的,不適用于全世界,所以并沒有得到普及。

今天我們來討論一下unicode編碼的字符進(jìn)行排序和正則匹配的問題。

ASCII字符的排序

ASCII的全稱叫做American Standard Code for Information Interchange,也就是美國信息交換標(biāo)準(zhǔn)代碼,到目前為止,ASCII只有128個字符。這里不詳細(xì)討論ASCII字符的構(gòu)成。感興趣的同學(xué)可以查看我之前寫的關(guān)于unicode的文章。

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

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

可以看到,這些字符是按照我們想要的字典的順序進(jìn)行排序的。

但是如果你將這些字符修改成中文,再進(jìn)行排序,那么就得到的并不是我們想要的結(jié)果:

const words = ['愛', '我', '中', '華']; words.sort(); // [ '中', '華', '我', '愛' ]

這是為什么呢?

其實(shí)默認(rèn)的這種sort是將字符串轉(zhuǎn)換成字節(jié),然后按照字節(jié)進(jìn)行字典順序排序。如果是中文,那么并不會將其進(jìn)行本地文字的轉(zhuǎn)換。

本地字符的排序

既然使用ASCII字符不能對中文進(jìn)行排序,那么我們其實(shí)是想將漢字轉(zhuǎn)換為拼音,然后按照拼音字母的順序來對其排序。

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

有什么簡單的方法來進(jìn)行比較嗎?

在一些瀏覽器中提供了Intl.Collator和String.prototype.localCompare兩種方法來進(jìn)行本地字符的比較。

比如我在chrome 91.0版本中:

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

再看下在firfox 89.0版本中:

結(jié)果和chrome是一致的。

下面是在nodejs v12.13.1版本的執(zhí)行結(jié)果:

可以看到在nodejs中,并沒有進(jìn)行本地字符的轉(zhuǎn)換和排序。

所以,上述的兩個方法是和瀏覽器有關(guān)系的,也就是說和具體的實(shí)現(xiàn)是相關(guān)的。我們并不能完全對其信任。

所以,要給字符串進(jìn)行排序是一件非常傻的事情!

為什么不使用unicode進(jìn)行排序

那么為什么不使用unicode進(jìn)行排序呢?

首先,對于普通用戶來說,他們并不知道unicode,他們所需要的也就是將字符串轉(zhuǎn)換為本地語言進(jìn)行字典排序。

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

emoji的正則匹配

文章最后,我們來講一下emoji的正則匹配問題。

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

(?:\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,有沒有簡單的辦法對其進(jìn)行正則匹配呢?答案是有的。

早在ECMAScript的TC39提議里面,就已經(jīng)把emoji的正則匹配加入了標(biāo)準(zhǔn)之中,我們可以使用{Emoji_Presentation}來表示。

\p{Emoji_Presentation}

是不是很簡單?

總結(jié)

本文簡單介紹了本地字符的排序規(guī)則和emoji表情的正則匹配。希望能夠給大家在實(shí)際工作中帶來幫助。

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

最通俗的解讀,最深刻的干貨,最簡潔的教程,眾多你不知道的小技巧等你來發(fā)現(xiàn)!

總結(jié)

以上是生活随笔為你收集整理的开发小技巧之:unicode的排序和正则匹配的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。