下面进行了解UTF-8的二进制编码方式。
为啥要了解这个,因为js中所有是string类型都是使用UTF-16编码的
因此我们与后端进行通信时,需要转换成与之一致的编码。(后端或者前端转换)
UTF-8编码方式
1. Unicode码范围 用十六进制表示
2. 8位二进制为一字节
Unicode码转换UTF-8
完整的 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') = "一"
复制代码
UTF-16编码方式
相对于来说比UTF8编码就简单了许多
Unicode转UTF-16
今天使用 U+22222(大于U+10000) 进行转码UTF16
先进行减去0x10000
0x22222 - 0x10000 = 0x12222 = 1 0010 0010 0010 0010
转换二进制并且分割位高低10位
二进制1111111111 = 1023十进制
利用按位与的特性获取低10位
二进制1111111111 & 1 00100010 00100010 = 10 0010 0010
十进制1023 & 0x12222 = 546
低10位加0xDC00
546 + 0xDC00 = 56866 = 0xde22
利用带符号右移运算符以及按位与获取高10位
0x12222 << 10 = 72 = 1001000
1001000 & 1111111111 = 1001000
72 & 1023 = 72
高10位加0xD800
72 + 0xD800 = 55368 = 0xd848
U+22222编码转UTF-16 = [0xd848,0xde22]
var str = ""
[0xd848,0xde22].forEach(item => {
str +=String.fromCharCode(item)
console.log(str)
复制代码
1.基础准备工作
2.Unicode转UTF16和UTF8
3.UTF-16和UTF-8转Unicode
明天就是假期了,尽可能的做出UTF-16与UTF-8 的互转。
大概原理就是先将 字符 逆推转为Unicode编码格式 然后再转你想要的编码格式
若有不足,多望指正。
毕竟也是才接触学习了两天。