webSocket 二进制传输基础准备-Unicode转UTF8

前言

今天学习一下编码,先回顾一下昨天的基础准备工作。

下面进行了解UTF-8的二进制编码方式。

为啥要了解这个,因为js中所有是string类型都是使用UTF-16编码的

因此我们与后端进行通信时,需要转换成与之一致的编码。(后端或者前端转换)

UTF-8编码方式

:

1.  Unicode码范围 用十六进制表示
 3.  8位二进制为一字节
Unicode码范围UTF-8编码方式占用字节
U+0000 ~ U+007F0xxxxxxx1
U+0080 ~ U+ 07FF110xxxxx 10xxxxxx2
U+0800 ~ U+FFFF1110xxxx 10xxxxxx 10xxxxxx3
U+10000 ~ U+10FFFF11110xxx 10xxxxxxx 10xxxxxx 10xxxxxx4

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') = "一"

相关推荐