字符串的最大长度
// 咱先不说字符串最大长度,先看下面单个字符的长度是多少
const str = '我'
str.length // 没错是1
const str1 = ''
str1.length // 还是1吗?nonono是2
那么为什么 ''的length是2呢,难道它不是真的你?不卖关子果断说明为什么
你 不是一个字,但这不是重点,重点是为什么前一个length会是2
编码
一个length => 一个编码单元
unicode:现行字符集国际标准中,字符以unicode表示
utf-16是unicode的编码方式
熟知的utf-8也为unicode的编码方式
下图可得出:utf-16编码中两个字节表示一个编码单元
编码历史
通过编码历史直观了解各编码方式之间的关系
首先贴一张网搜图
ASCII字符集
- 美国人发明计算机
1 用一个字节表示所有字符(第一位为0) 0 1 0 1 0 0 0 1 - 某些欧洲国家开始使用计算机
1 扩展ASCII字符集(占用之前未使用的第一位) 1 1 0 1 0 0 0 1
一般情况下<128的采用
Unicode
- unicode意在将所有字符都登记入册
-
那么关于unicode码点如何存储到计算机中,又衍生出了多种编码方式
大端法小端法
预知编码方式,先知大端法小端法表示
- BOM字节序 0x12 34 56 78
- BOM(Byte Order Mark):字节序出现在文件头部,标识字节的顺序
- 大端法处理:高字节放在低地址处,字节序FEFF
utf-8 一个字节为编码单元,无字节序
utf-16 两个字节为编码单元 0x1234 5678 0x3412 7856,在解释一个UTF-16文本前,首先要弄清楚每个编码单元的字节序
utf-32 处理单元为四个字节 0x12345678 0x78563412 - 高字节低字节如何二进制存储:
0x22334455
占用:4个字节
占用计算:一个16进制位占4bit(一个16进制位最大是F,二进制是1111,占用4位)
两个16进制位1byte(字节)
关于UTF-8(详解)
- 工具-在线进制转换:https://tool.oschina.net/hexconvert/
- UTF-8究竟怎么编码的:https://zhuanlan.zhihu.com/p/27364614
- 工具-unicode和utf转码:https://www.qqxiuzi.cn/bianma/Unicode-UTF.php
- 变长字节表示
- 按需分配,字节数与unicode编号大小有关,编号小的使用字节少
1 utf-8首字节前缀码判断字节数
2 如果首字节以0开头,肯定是单字节编码(即单个单字节码元)
3 如果首字节以110开头,肯定是双字节编码(即由两个单字节码元所组成的双码元序列)
4 如果首字节以1110开头,肯定是三字节编码(即由三个单字节码元所组成的三码元序列),以此类推。 - 前缀码0、110、1110、10,其中前缀码110、1110,10中的0是前缀码中的终结标志
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编码范围与对应的UTF-8二进制格式
1 一个字节:0-127与ASCII码是相同的
2 n(n>1)字节:第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10,其余位用unicode编码的二进制填充
(上图来源于网络)
- 比如:'我' U+6211
unicode二进制: 110 001000 010001
UTF-8二进制 : 11000110 10001000 10010001
关于UTF-16
UTF-16究竟如何编码的:https://zhuanlan.zhihu.com/p/27417641
- 变长字节表示(字节数)
- Unicode U+0000~U+FFFF
1 两字节
2 编码后等于unicode值
'我' U+6211 -
U+10000~U+10FFFF 四字节
1 四字节
2 U+2F804
关于代理区深度好文
辅助平面共有2^20个代码点,UTF-16将其拆成两半映射在U+D800-U+DBFF称为高位(H),后十位映射在DC00-DFFFF称为低位(L)
一个辅助平面的字符拆成两个基本平面的字符处理
参考文档
为什么说js最大安全整数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的关系:https://blog.csdn.net/hongsong673150343/article/details/88584753
js最多存储多少字节: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
细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4:https://www.cnblogs.com/malecrab/p/5300503.html