[oeasy]python0132_[專業(yè)選修]utf-8_unicode_transformation_format_8_編碼
utf-8
回憶上次內(nèi)容
上次再次輸出了大紅心<span style="color:red">?</span>
找到了紅心對應(yīng)的編碼
黑紅梅方都對應(yīng)有編碼
原來的編碼叫做 ascii?
\u
這種新的編碼方式叫unicode包括了 中日韓字符集等 各書寫系統(tǒng)的字符集
但是有個問題
拜這個字
在字節(jié)中應(yīng)該是b"\x62\xdc"兩個字節(jié)

該如何理解b"\x62\xdc"這兩個字節(jié)呢???
究竟是"拜"
還是"bü"呢?

在文件系統(tǒng)中驗證
首先進入 vi
然后在插入模式下寫一個
一
點擊桌面上的sougo圖表
在右下角的鍵盤位置選擇中文
然后就可以輸入中文了

:%!xxd

一
字4e00
兩個字節(jié)
e4b880
三個字節(jié)
存儲的狀態(tài)是
并不是unicode對應(yīng)的
我們還是得區(qū)分一下概念
字符集和字符集編碼
字符集(Character-Set)是
ord
chr
指的是字符和序號之間的對應(yīng)關(guān)系
函數(shù)是
字符集編碼(Character-Set Encoding)
encode
decode
指的是把字符集里面的所有字符
放到計算機的字節(jié)里
函數(shù)是
ascii、gb2312、BIG5
既是字符集
又是字符編碼

unicode如何呢?
unicode
一般來講unicode是字符集
可以用ord和chr
但Unicode一般不做字符集編碼

用字符集什么來進行字符編碼呢?
utf-8
utf-8 是一種可變長度的字符編碼格式
有的時候 1 字節(jié) 利用他省空間
有的時候 2 字節(jié) 利用他很平衡
有的時候 3 字節(jié) 利用他范圍廣
再往后 利用的更是他范圍廣
這不就兩方面好處都得到了么
utf-8 的意思是
Unicode Transformation Format – 8-bit

這和 unicode 到底有什么區(qū)別呢?
存儲規(guī)則
Unicode 是
字符集
找到每一個字符的唯一編碼
Universal Coded Character Set
字符集:為每一個
字符
分配一個唯一的數(shù)字ID
(學名為碼位 / 碼點 / Code Point / 字符的身份證號)
可以在 https://home.unicode.org/

utf-8 是
字符集編碼方案
系統(tǒng)就知道這個到底是幾個字節(jié)存儲的
Unicode Transformation Format – 8-bit
編碼規(guī)則:將「碼位」轉(zhuǎn)換為字節(jié)序列的規(guī)則(編碼/解碼 可以理解為 加密/解密 的過程)
而且讀到字符之后
具體編碼
那這個東西怎么具體存儲和操作呢?

一(4E00) 在上圖中
屬于第三行的范圍
從 0800-FFFF
所以三個字節(jié)
如下圖套入模板

具體存儲的狀態(tài)呢?
具體字節(jié)狀態(tài)
:%!xxd

說明我們用的確實是utf-8編碼
可以解碼回來嗎?

utf-8 解碼 E4B080 轉(zhuǎn)化為 unicode 編碼是 4E00
后面的
0a
是 換行LineFeed
或者叫做
NL(NewLine)
如果是兩個
一
呢
動手
兩個字符相同的

得到兩個同樣的三字節(jié)utf-8存儲
以及最后的
或者叫做
NL(NewLine)
0a
依然是 換行LineFeed
可以在反匯編指令層面中看到么???
反編譯
:%!xxd
轉(zhuǎn)化為字節(jié)碼狀態(tài)
漢字確實可以在字節(jié)碼狀態(tài)中觀察到
編碼解碼
第一次編碼
把漢字編碼為
unicode
具體就是把
一
編碼為 unicode 值0x4e00
這個編號第二次編碼
把
unicode
值編碼為utf-8
值具體就是把 unicode 值
0x4e00
編碼為0xe4b880
可以落實到字節(jié)里
第一次解碼
把
utf-8
解碼為unicode
具體就是把 utf-8 值
0xe4b880
解碼為0x4e00
把字節(jié)還原為序號
第二次解碼
把
unicode
解碼為漢字具體就是把
0x4e00
解碼為一
找到序號對應(yīng)的字符
unicode編碼是utf-8存儲形式和具體漢字中間的橋梁
驗證編碼
原始字符串
"一"
查看原始字符串utf-8編碼
"一".encode("utf-8")
給utf-8編碼解碼
b"\xe4\xb8\x80".decode("utf-8")
先編碼再解碼
"一".encode("utf-8").decode("utf-8")
先解碼再編碼
b"\xe4\xb8\x80".decode("utf-8").encode("utf-8")
b"\xe4\xb8\x80"是幾個字節(jié)的類型呢?
字節(jié)序列類
前綴 b 表示 byte 字節(jié)
后面的是 bytes類型對應(yīng)的 字節(jié)序列
\x 是前綴
b"\xe4\xb8\x80"是三個字節(jié)的序列
默認編碼
utf-8 是系統(tǒng)默認的編碼格式
一般都是這種編碼格式
這一個字符就對應(yīng)三個字節(jié)
可以用長度來描述字符么?
字符長度
len()函數(shù)
可以衡量出字符串的長度
也可以衡量出編碼后字節(jié)序列的長度
ascii[0,127] 字符 的長度
就是字節(jié)的長度
漢字呢?
漢字
字母
a
對應(yīng)著一個字節(jié)漢字
一
對應(yīng)著三個字節(jié)
這個unicode的編碼空間
究竟是怎么安排的呢?
排好座次
所有unicode字符 被分成了4檔
2 字節(jié)
3 字節(jié)
4 字節(jié)
1 字節(jié)
ascii
后面的字符有可能用
0開頭的
ascii
英文字符和數(shù)字占據(jù)最大范圍兼容
10開頭的
拉丁
希臘
西里爾
等等
2 字節(jié)
主要是拼音符號文字
110開頭的
首先是印度
然后是雜項
然后是符號
日文假名
然后是中日韓 CJK
3 字節(jié)范圍內(nèi)
11110開頭的
4 字節(jié)
表情符號emoji??
各種擴展集
極大擴展
unicode字符集 開始逐漸流行
utf-8所代表的存儲編碼也開始流行
一旦一種編碼在世界上開始流行
到了 2020 年 95%的網(wǎng)頁使用 unicode 編碼
到了 2021 已經(jīng)達到了 97.4%
他就會擠壓其他的編碼方式的生存空間
感覺這是全球化一體最終的編碼方式
https://w3techs.com/technologies/overview/character_encoding
字符大戰(zhàn)終局
關(guān)于編碼的世界大戰(zhàn)
分久必合
最終的勝利者是unicode和utf-8
他們彼此也可以相互轉(zhuǎn)化
相互轉(zhuǎn)化
unicode形式
"\u4e00"
把unicode編碼按照utf-8編碼
"\u4e00".encode("utf-8")
先把unicode編碼為utf-8,再解碼回unicode
"\u4e00".encode("utf-8").decode("utf-8")
把utf-8編碼解碼回unicode編碼
b"\xe4\xb8\x80".decode("utf-8")
把utf-8編碼先解碼回unicode編碼,再編碼為utf-8
b"\xe4\xb8\x80".decode("utf-8").encode("utf-8")
曾經(jīng)掌握了 ascii 碼和 ascii 字符的轉(zhuǎn)化方法
也要掌握 unicode 和 utf-8 雙向轉(zhuǎn)化的方法
gb2312系列又如何了呢?
gbk的演化
80年的gb2312
95年的gbk
05年有了gb18030
全稱:國家標準 GB 18030-2005《信息技術(shù)中文編碼字符集》
是中華人民共和國現(xiàn)時最新的內(nèi)碼字集
是 GB 18030-2000《信息技術(shù)信息交換用漢字編碼字符集基本集的擴充》的修訂版
有多少字符了呢?
字符集
GB 18030 與 GB 2312-1980 和 GBK 兼容
采用多字節(jié)編碼
每個字可以由 1 個、2 個或 4 個字節(jié)組成
編碼空間龐大
共收錄漢字<span style="font-size:80px">70244</span>個
與 utf-8 相同
utf-8標準海納百川
GB18030用的人很少
但始終依然存在
GB18030有什么作用呢???
亂碼問題
有的時候還會遇到 gb18030 編碼的文檔
用 utf-8編碼方式
打開 gb18030編碼 的文件
就會亂碼
這個時候可以在 vim 中使用命令
:edit ++enc=gb18030
可以解決問題
gb18030 用的人少
有用的人少的好處
如果只會用utf-8解碼
那么gb18030本身就構(gòu)成了加密系統(tǒng)
只有懂漢語并且懂編碼才能看懂
不懂的話只能見到亂碼
想要自動翻譯都不行
總結(jié)
這次了解了
unicode
和utf-8
unicode
是字符集utf-8
是一種可變長度的編碼方式utf-8
是實現(xiàn)unicode
的存儲和傳輸?shù)默F(xiàn)實的方式
unicode
讓字符范圍得到了極大擴展unicode
到底還擴展出什么好玩的字符呢???我們下次再說!??
藍橋->https://www.lanqiao.cn/courses/3584
github->https://github.com/overmind1980/oeasy-python-tutorial
gitee->https://gitee.com/overmind1980/oeasypython