80467305 2019-07-01
今天学习一下编码,先回顾一下昨天的基础准备工作。
下面进行了解UTF-8的二进制编码方式。
为啥要了解这个,因为js中所有是string类型都是使用UTF-16编码的
因此我们与后端进行通信时,需要转换成与之一致的编码。(后端或者前端转换)
注:
1. Unicode码范围 用十六进制表示 3. 8位二进制为一字节
Unicode码范围 | UTF-8编码方式 | 占用字节 |
---|---|---|
U+0000 ~ U+007F | 0xxxxxxx | 1 |
U+0080 ~ U+ 07FF | 110xxxxx 10xxxxxx | 2 |
U+0800 ~ U+FFFF | 1110xxxx 10xxxxxx 10xxxxxx | 3 |
U+10000 ~ U+10FFFF | 11110xxx 10xxxxxxx 10xxxxxx 10xxxxxx | 4 |
Unicode编码表
使用,转换到UTF-8编码
在Unicode中汉字 “一”编码为U+4E00,"丁"编码为 U+4E01这样想必就看得懂表了
下面进行开始转换吧
回顾昨日的二进制与十六进制
U+4E00用十六进制表示 0x4E00 转换二进制,按位转换 4 = 0100 E = 14 = 1110 0 = 0000 0 = 0000 0x4E00 = 0100 1110 0000 0000 = 19968 0x0800< 0x4E00 < 0xFFFF 得出是三个字节。 UTF-8三字节的编码方式 从 0100 1110 0000 0000 变成 1110 xxxx 10 xxxxxx 10 xxxxxx格式 由从末位到首位进行顺位插入的方式 0100 111000 000000 1110 xxxx 10 xxxxxx 10 xxxxxx 1110 0100 10 111000 10 000000 其中利用js的按位操作符 符号操作符进行转换 先替换原码(从末位到首位)的第7位8位 第一字节 utf-8 3字节中的第一字节格式 为 10 xxxxxx所有截取6位(原码与编码对应的 为x的位值,要保持不变, 编码其中的x位值全部为原码) 先利用按位与的特性(全1为1 否则为0)进行截取原码的末6位 二进制 111111 = 63十进制 0100 1110 0000 0000 & 0000 0000 0011 1111 = 000000 19968 & 63 = 000000 UTF-8的第一字节格式为 10 xxxxxx所以利用按位或的特性(遇1为1,全0 为0)来变换UTF-8 3字节中的第一个字节的编码方式 将x替代为0 得出 10 000000 二进制 10 000000 = 128; 按位或 00 000000 | 10 000000 = 10 000000 0 | 128 = 128 第二个字节 UTF-8 3字节中的第二字节依然是10 xxxxxx格式,所以只需要从第6位开始进行截取6位 利用带符号右移操作符 a >> b 首位开始补 b 个 首位值 右侧舍去b个位 先舍去末6位 0100 1110 0000 0000 >> 6 = 000 000 0100 1110 00 19968 >> 6 = 312 利用按位与进行截取 000 000 0100 1110 00 & 111111 = 111 000 312 & 63 = 56 继续利用按位或进行变换 00 111000 | 10 000000 = 10 111000 56 | 128 = 184 第三字节 utf-8 3字节的第三字节编码方式为 1110 xxxx 所以只需要从第12开始截取4位 从末位第12位开始截取4位,利用带符号右移操作符 a >> b 首位开始补 b 个 首位值 右侧舍去b个位 0100 1110 0000 0000 >> 12 = 000 000 0000 0100 19968 >> 12 = 4 利用按位与进行截取 4位 二进制 1111 = 15 0100 & 1111 = 0100 4 & 15 = 4; 利用按位或进行变换 二进制 1110 0000 = 224 0000 0100 | 1110 0000 = 1110 0100 4 | 224 = 228 三个字节组合起来 228 184 128 = 1110 0100 1011 1000 1000 0000(二进制) = 14 4 11 8 8 0( 四位转一位十进制) =0xe4b880(十六进制) Unicode转utf-8 0x4E00 = 0xe4b880 python编码转换 b'\xe4\xb8\x80'.decode('utf-8') = "一"
responseType: ‘arraybuffer‘, //ArrayBuffer涉及面比较广,我的理解是ArrayBuffer代表内存之中的一段二进制数据,一旦生成不能再改。可以通过视图进行操作。