charCodeAt與codePointAt(js字符串的碼元與碼點(diǎn))

charCodeAt與codePointAt的用法:

相同點(diǎn)

  • charCodeAt與codePointAt都是字符串實(shí)例上的方法瞒窒,用途都是用來返回指定索引位字符的Unicode編碼。

不同點(diǎn)

  • charCodeAt與codePointAt匹配索引位的規(guī)則不一樣。charCodeAt是根據(jù)碼元來匹配赠制,codePointAt是根據(jù)碼點(diǎn)來進(jìn)行匹配的蘸炸。

先舉個(gè)例子:


image

可以發(fā)現(xiàn)一個(gè)非常神奇的事情卤材。

有些中文字符 ?? 、 ?? 的長(zhǎng)度不為1济榨,并且charCodeAtcodePointAt對(duì)相同字進(jìn)行處理返回的結(jié)果卻是不同的。

這其中的原因就是charCodeAt是以一個(gè)碼元為一個(gè)索引绿映,codePointAt是以一個(gè)碼點(diǎn)為一個(gè)索引進(jìn)行處理的

Unicode使用16位二進(jìn)制來存儲(chǔ)文字擒滑。我們將一個(gè)16位的二進(jìn)制編碼叫做一個(gè)碼元(Code Unit),Unicode編碼范圍在0 - 2^16叉弦。也就是我們所說的占2個(gè)字節(jié)丐一。

由于技術(shù)的發(fā)展,Unicode對(duì)文字編碼進(jìn)行了擴(kuò)展卸奉,將某些文字?jǐn)U展到了32位(占用兩個(gè)碼元)钝诚,并且,將某個(gè)文字對(duì)應(yīng)的二進(jìn)制數(shù)字叫做碼點(diǎn)(Code Point)榄棵,Unicode編碼范圍在0 - 2^32凝颇,占4個(gè)字節(jié)。

特別要注意疹鳄,碼點(diǎn)可以是一個(gè)碼元拧略,也可以是兩個(gè)碼元。

字符串的length屬性返回的是碼元瘪弓。所以在對(duì)一些字符串如果要處理長(zhǎng)度的時(shí)候要注意這一點(diǎn)垫蛆。

?? 這個(gè)字的Unicode編碼是 \ud842\udfb7,占用了兩個(gè)碼元。

所以當(dāng)用charCodeAt(0)是匹配0位的碼元袱饭,也就是返回給我們55362川无。

當(dāng)用codePointAt(0)是匹配0位的碼元,codePointAt能識(shí)別出字符串的碼點(diǎn)虑乖,所以反回134071懦趋,反之將直接返回在那個(gè)索引處的編碼單元

??.codePointAt(1)為什么返回的是57271呢?

這是因?yàn)樗饕皇歉鶕?jù)碼元疹味,而匹配的規(guī)則是根據(jù)碼點(diǎn)的規(guī)則仅叫。如果后面兩位碼元是一個(gè)碼點(diǎn),就會(huì)當(dāng)作一個(gè)碼點(diǎn)來處理糙捺。

總結(jié)

charCodeAt是以碼元為單位來處理的诫咱,也就是說按照每16位2進(jìn)制數(shù)為單位。一個(gè)16位2進(jìn)制數(shù)就是一位洪灯,所以處理不了Unicode擴(kuò)展編碼字符(32位2進(jìn)制)坎缭。他會(huì)把32位2進(jìn)制數(shù)當(dāng)成兩個(gè)16位2進(jìn)制數(shù)處理

codePointAt也是以碼元位單位來處理的。與charCodeAt不同的地方是婴渡,當(dāng)處理到當(dāng)前位碼元時(shí)幻锁,如果超過了16位2進(jìn)制數(shù)值的上線,他就明白這是一個(gè)32位2進(jìn)制數(shù)边臼,就會(huì)以32位2進(jìn)制數(shù)當(dāng)作一個(gè)來處理哄尔。

可以通過codePointAt來判斷當(dāng)前字符是是32位的(倆個(gè)碼元)還是16位的(單個(gè)碼元)

function is32bit(char, i) {
    //如果碼點(diǎn)大于了16位二進(jìn)制的最大值,則其是32位的
    return char.codePointAt(i) > 0xffff;
}

同樣的柠并,也可以通過這個(gè)方法來判斷以字符串真實(shí)的長(zhǎng)度(碼點(diǎn)的長(zhǎng)度)

function getLengthOfCodePoint(str) {
    var len = 0;
    for (let i = 0; i < str.length; i++) {
        //i在索引碼元
        if (is32bit(str, i)) {
            //當(dāng)前字符串岭接,在i這個(gè)位置,占用了兩個(gè)碼元
            i++;
        }
        len++;
    }
    return len;
}

轉(zhuǎn)自:
https://www.cnblogs.com/yongG/p/12153646.html

相關(guān)參考
“短”化你的代碼
遍?布?互?聯(lián)?網(wǎng)?的?神?秘?電?波?是?如?何?制?作?出?來?的?臼予??
Unicode Consortium
Unicode 字符表
Web瀏覽器和其他應(yīng)用程序中對(duì)Unicode的支持

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸣戴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子粘拾,更是在濱河造成了極大的恐慌窄锅,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缰雇,死亡現(xiàn)場(chǎng)離奇詭異入偷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)械哟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門疏之,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人暇咆,你說我怎么就攤上這事锋爪”铮” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵其骄,是天一觀的道長(zhǎng)亏镰。 經(jīng)常有香客問我,道長(zhǎng)拯爽,這世上最難降的妖魔是什么拆挥? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮某抓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘惰瓜。我一直安慰自己否副,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布崎坊。 她就那樣靜靜地躺著备禀,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奈揍。 梳的紋絲不亂的頭發(fā)上曲尸,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音男翰,去河邊找鬼另患。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛾绎,可吹牛的內(nèi)容都是我干的昆箕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼租冠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鹏倘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起顽爹,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤纤泵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后镜粤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捏题,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年繁仁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了涉馅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黄虱,死狀恐怖稚矿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤晤揣,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布桥爽,位于F島的核電站,受9級(jí)特大地震影響昧识,放射性物質(zhì)發(fā)生泄漏钠四。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一跪楞、第九天 我趴在偏房一處隱蔽的房頂上張望缀去。 院中可真熱鬧,春花似錦甸祭、人聲如沸缕碎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咏雌。三九已至,卻和暖如春校焦,著一層夾襖步出監(jiān)牢的瞬間赊抖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工寨典, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留氛雪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓耸成,卻偏偏與公主長(zhǎng)得像注暗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子墓猎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355