今天學習一下編碼,先回顧一下昨天的基礎準備工做。前端
下面進行了解UTF-8的二進制編碼方式。python
爲啥要了解這個,由於js中全部是string類型都是使用UTF-16編碼的segmentfault
所以咱們與後端進行通訊時,須要轉換成與之一致的編碼。(後端或者前端轉換)後端
注:學習
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中漢字 「一」編碼爲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') = "一"