webSocket 二進制傳輸基礎準備-Unicode轉UTF8

前言

今天學習一下編碼,先回顧一下昨天的基礎準備工做前端

下面進行了解UTF-8的二進制編碼方式。python

爲啥要了解這個,由於js中全部是string類型都是使用UTF-16編碼的segmentfault

所以咱們與後端進行通訊時,須要轉換成與之一致的編碼。(後端或者前端轉換)後端

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 = 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') = "一"
相關文章
相關標籤/搜索