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

5次阅读

共计 1651 个字符,预计需要花费 5 分钟才能阅读完成。

前言
今天学习一下编码,先回顾一下昨天的基础准备工作。
下面进行了解 UTF- 8 与 UTF-16 的二进制编码方式。
为啥要了解这个,因为 js 中所有是 string 类型都是使用 UTF-16 编码的
因此我们与后端进行通信时,需要转换成与之一致的编码。(后端或者前端转换)
UTF- 8 编码方式
注:
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 编码表使用,转换到 UTF- 8 编码在 Unicode 中汉字“一”编码为 U +4E00,” 丁 ” 编码为 U+4E01 这样想必就看得懂表了下面进行开始转换吧回顾昨日的二进制与十六进制
U+4E00 用十六进制表示 0x4E00
转换二进制,按位转换
4 = 0011
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(十六进制)
utf-16 转 utf-8
0x4E00 = 0xe4b880

python 编码转换
b’\xe4\xb8\x80′.decode(‘utf-8’) = “ 一 ”

正文完
 0