字符串的最大長(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
編碼
一個(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è)編碼單元
編碼歷史
通過(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(詳解)
- 工具-在線(xiàn)進(jìn)制轉(zhuǎn)換:https://tool.oschina.net/hexconvert/
- UTF-8究竟怎么編碼的:https://zhuanlan.zhihu.com/p/27364614
- 工具-unicode和utf轉(zhuǎn)碼:https://www.qqxiuzi.cn/bianma/Unicode-UTF.php
- 變長(zhǎng)字節(jié)表示
- 按需分配辑奈,字節(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)推稍计。 - 前綴碼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) -
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ò))
- 比如:'我' 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
- 變長(zhǎng)字節(jié)表示(字節(jié)數(shù))
- Unicode U+0000~U+FFFF
1 兩字節(jié)
2 編碼后等于unicode值
'我' U+6211 -
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