從字符串最大長(zhǎng)度到字符編碼

字符串的最大長(zhǎng)度

// 咱先不說(shuō)字符串最大長(zhǎng)度,先看下面單個(gè)字符的長(zhǎng)度是多少
const str = '我'
str.length // 沒(méi)錯(cuò)是1
const str1 = '??'
str1.length // 還是1嗎?nonono是2
那么為什么 '??'的length是2呢鄙才,難道它不是真的你翩活?不賣(mài)關(guān)子果斷說(shuō)明為什么

?? 你 不是一個(gè)字,但這不是重點(diǎn)侮腹,重點(diǎn)是為什么前一個(gè)length會(huì)是2

image.png

編碼

一個(gè)length => 一個(gè)編碼單元
unicode:現(xiàn)行字符集國(guó)際標(biāo)準(zhǔn)中,字符以u(píng)nicode表示
utf-16是unicode的編碼方式
熟知的utf-8也為unicode的編碼方式
下圖可得出:utf-16編碼中兩個(gè)字節(jié)表示一個(gè)編碼單元
image.png

image.png

編碼歷史

通過(guò)編碼歷史直觀(guān)了解各編碼方式之間的關(guān)系
首先貼一張網(wǎng)搜圖

ASCII字符集

  • 美國(guó)人發(fā)明計(jì)算機(jī)
    1 用一個(gè)字節(jié)表示所有字符(第一位為0) ?? 0 1 0 1 0 0 0 1
  • 某些歐洲國(guó)家開(kāi)始使用計(jì)算機(jī)
    1 擴(kuò)展ASCII字符集(占用之前未使用的第一位) ?? 1 1 0 1 0 0 0 1
    一般情況下<128的采用

Unicode

  • unicode意在將所有字符都登記入冊(cè)
  • 那么關(guān)于unicode碼點(diǎn)如何存儲(chǔ)到計(jì)算機(jī)中稻励,又衍生出了多種編碼方式


    image.png
大端法小端法

預(yù)知編碼方式父阻,先知大端法小端法表示

  • BOM字節(jié)序 0x12 34 56 78
  • BOM(Byte Order Mark):字節(jié)序出現(xiàn)在文件頭部,標(biāo)識(shí)字節(jié)的順序
  • 大端法處理:高字節(jié)放在低地址處望抽,字節(jié)序FEFF
    utf-8 一個(gè)字節(jié)為編碼單元加矛,無(wú)字節(jié)序
    utf-16 兩個(gè)字節(jié)為編碼單元 0x1234 5678 0x3412 7856,在解釋一個(gè)UTF-16文本前煤篙,首先要弄清楚每個(gè)編碼單元的字節(jié)序
    utf-32 處理單元為四個(gè)字節(jié) 0x12345678 0x78563412
  • 高字節(jié)低字節(jié)如何二進(jìn)制存儲(chǔ):
    0x22334455
    占用:4個(gè)字節(jié)
    占用計(jì)算:一個(gè)16進(jìn)制位占4bit(一個(gè)16進(jìn)制位最大是F斟览,二進(jìn)制是1111,占用4位)
    兩個(gè)16進(jìn)制位1byte(字節(jié))

    image.png
關(guān)于UTF-8(詳解)
  1. 變長(zhǎng)字節(jié)表示
  2. 按需分配辑奈,字節(jié)數(shù)與unicode編號(hào)大小有關(guān)苛茂,編號(hào)小的使用字節(jié)少
    1 utf-8首字節(jié)前綴碼判斷字節(jié)數(shù)
    2 如果首字節(jié)以0開(kāi)頭,肯定是單字節(jié)編碼(即單個(gè)單字節(jié)碼元)
    3 如果首字節(jié)以110開(kāi)頭鸠窗,肯定是雙字節(jié)編碼(即由兩個(gè)單字節(jié)碼元所組成的雙碼元序列)
    4 如果首字節(jié)以1110開(kāi)頭妓羊,肯定是三字節(jié)編碼(即由三個(gè)單字節(jié)碼元所組成的三碼元序列),以此類(lèi)推稍计。
  3. 前綴碼0躁绸、110、1110、10净刮,其中前綴碼110剥哑、1110,10中的0是前綴碼中的終結(jié)標(biāo)志
    1 8-1=7位(2^7-1=127)
    2 16-5=11位(2^11-1=2047)
    3 24-8=16位(2^16-1=65535)
    4 32-11=21位(2^21-1=2097151)
  4. Unicode編碼范圍與對(duì)應(yīng)的UTF-8二進(jìn)制格式
    1 一個(gè)字節(jié):0-127與ASCII碼是相同的
    2 n(n>1)字節(jié):第一個(gè)字節(jié)的前n位都設(shè)為1庭瑰,第n+1位設(shè)為0星持,后面字節(jié)的前兩位一律設(shè)為10抢埋,其余位用unicode編碼的二進(jìn)制填充


    image.png

    (上圖來(lái)源于網(wǎng)絡(luò))

  5. 比如:'我' U+6211
    unicode二進(jìn)制: 110 001000 010001
    UTF-8二進(jìn)制 : 11000110 10001000 10010001
關(guān)于UTF-16

UTF-16究竟如何編碼的:https://zhuanlan.zhihu.com/p/27417641

image.png

  1. 變長(zhǎng)字節(jié)表示(字節(jié)數(shù))
  2. Unicode U+0000~U+FFFF
    1 兩字節(jié)
    2 編碼后等于unicode值
    '我' U+6211
  3. U+10000~U+10FFFF 四字節(jié)
    1 四字節(jié)
    2 ?? U+2F804


    image.png

關(guān)于代理區(qū)深度好文
輔助平面共有2^20個(gè)代碼點(diǎn)弹灭,UTF-16將其拆成兩半映射在U+D800-U+DBFF稱(chēng)為高位(H),后十位映射在DC00-DFFFF稱(chēng)為低位(L)
一個(gè)輔助平面的字符拆成兩個(gè)基本平面的字符處理

參考文檔
為什么說(shuō)js最大安全整數(shù)2^53-1:https://juejin.cn/post/6880143057930190855
GB2312:http://www.4e00.com/blog/web/2015/11/30/gb2312-charset.html
unicode和utf8 utf16 utf32的關(guān)系:https://blog.csdn.net/hongsong673150343/article/details/88584753
js最多存儲(chǔ)多少字節(jié):https://www.zhihu.com/question/61105131/answer/184466677
大端小端法:https://blog.51cto.com/cnn237111/1080628
String.length:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/length
細(xì)說(shuō):Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4:https://www.cnblogs.com/malecrab/p/5300503.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末揪垄,一起剝皮案震驚了整個(gè)濱河市穷吮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌饥努,老刑警劉巖捡鱼,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異酷愧,居然都是意外死亡驾诈,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)溶浴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乍迄,“玉大人,你說(shuō)我怎么就攤上這事士败〈沉剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵谅将,是天一觀(guān)的道長(zhǎng)漾狼。 經(jīng)常有香客問(wèn)我,道長(zhǎng)饥臂,這世上最難降的妖魔是什么逊躁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮隅熙,結(jié)果婚禮上稽煤,老公的妹妹穿的比我還像新娘。我一直安慰自己猛们,他們只是感情好念脯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著弯淘,像睡著了一般绿店。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天假勿,我揣著相機(jī)與錄音借嗽,去河邊找鬼。 笑死转培,一個(gè)胖子當(dāng)著我的面吹牛恶导,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浸须,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼惨寿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了删窒?” 一聲冷哼從身側(cè)響起裂垦,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎肌索,沒(méi)想到半個(gè)月后蕉拢,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诚亚,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年晕换,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片站宗。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闸准,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出份乒,到底是詐尸還是另有隱情嘱函,我是刑警寧澤臭杰,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響账锹,放射性物質(zhì)發(fā)生泄漏做葵。R本人自食惡果不足惜酗洒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一窗骑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧耳鸯,春花似錦湿蛔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至财喳,卻和暖如春察迟,著一層夾襖步出監(jiān)牢的瞬間斩狱,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工扎瓶, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留所踊,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓概荷,卻偏偏與公主長(zhǎng)得像秕岛,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子误证,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.各種編碼格式 原理以及發(fā)展歷史 1.1 ASCII碼 早起計(jì)算機(jī)發(fā)展初期继薛,肯定是以字母為標(biāo)準(zhǔn)的,沒(méi)考慮世界上其...
    熊貓人和熊貓君閱讀 1,484評(píng)論 0 0
  • 寫(xiě)在前面 在開(kāi)發(fā)中我們經(jīng)常會(huì)遇到限制字符串長(zhǎng)度問(wèn)題雷厂,如果用的是 NSString 很自然使用字符串屬性 leng...
    mtry閱讀 482評(píng)論 0 0
  • 原文參考:https://www.cnblogs.com/tangjuanj/p/6015806.html iOS...
    Rui哥閱讀 2,727評(píng)論 0 1
  • 1 字符編碼 1.1 什么是字符編碼 眾所周知惋增,在計(jì)算機(jī)的世界中,不管是存儲(chǔ)還是傳輸都是通過(guò)二進(jìn)制(單位:比特改鲫,b...
    路過(guò)的豬閱讀 1,293評(píng)論 0 0
  • 眾所周知,java中如果要計(jì)算一個(gè)字符串的長(zhǎng)度林束,可以直接利用String的length方法像棘。如下: 顯然,這里的l...
    2205閱讀 1,314評(píng)論 0 0