欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

从最大字符串长度到字符编码

最编程 2024-04-27 22:43:52
...

字符串的最大长度

// 咱先不说字符串最大长度,先看下面单个字符的长度是多少
const str = '我'
str.length // 没错是1
const str1 = '????'
str1.length // 还是1吗?nonono是2
那么为什么 '????'的length是2呢,难道它不是真的你?不卖关子果断说明为什么

???? 你 不是一个字,但这不是重点,重点是为什么前一个length会是2

image.png

编码

一个length => 一个编码单元
unicode:现行字符集国际标准中,字符以unicode表示
utf-16是unicode的编码方式
熟知的utf-8也为unicode的编码方式
下图可得出:utf-16编码中两个字节表示一个编码单元
image.png

image.png

编码历史

通过编码历史直观了解各编码方式之间的关系
首先贴一张网搜图
image.png

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码点如何存储到计算机中,又衍生出了多种编码方式


    image.png
大端法小端法

预知编码方式,先知大端法小端法表示

  • 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(字节)

    image.png
关于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
  1. 变长字节表示
  2. 按需分配,字节数与unicode编号大小有关,编号小的使用字节少
    1 utf-8首字节前缀码判断字节数
    2 如果首字节以0开头,肯定是单字节编码(即单个单字节码元)
    3 如果首字节以110开头,肯定是双字节编码(即由两个单字节码元所组成的双码元序列)
    4 如果首字节以1110开头,肯定是三字节编码(即由三个单字节码元所组成的三码元序列),以此类推。
  3. 前缀码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)
  4. Unicode编码范围与对应的UTF-8二进制格式
    1 一个字节:0-127与ASCII码是相同的
    2 n(n>1)字节:第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10,其余位用unicode编码的二进制填充


    image.png

    (上图来源于网络)

  5. 比如:'我' U+6211
    unicode二进制: 110 001000 010001
    UTF-8二进制 : 11000110 10001000 10010001
关于UTF-16

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

image.png

  1. 变长字节表示(字节数)
  2. Unicode U+0000~U+FFFF
    1 两字节
    2 编码后等于unicode值
    '我' U+6211
  3. U+10000~U+10FFFF 四字节
    1 四字节
    2 ???? U+2F804


    image.png

关于代理区深度好文
辅助平面共有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.****.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

推荐阅读