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

栏目: 后端 · 发布时间: 5年前

内容简介:今天学习一下编码,先回顾一下昨天的基础准备工作。下面进行了解UTF-8与UTF-16的二进制编码方式。为啥要了解这个,因为js中所有是string类型都是使用UTF-16编码的

前言

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

下面进行了解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') = "一"

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

迎接互联网的明天

迎接互联网的明天

邹静 / 电子工业 / 2011-6 / 55.00元

《迎接互联网的明天-玩转3D Web(附盘)》,全书共5章,第1章主要阐述了国内外空前繁荣的3D互联网技术领域,以及这些领域透射出来的潜在商机;第2章主要用当下比较流行的Flash编程语言ActionScript 3,来向大家介绍面向对象编程语言的思想概念,以及一些3D渲染技术的入门知识;第3章注重建模知识的运用,主要运用WireFusion和3ds Max来制作3D网页;第4章主要介绍3D游戏编......一起来看看 《迎接互联网的明天》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

SHA 加密
SHA 加密

SHA 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具