電腦文字編碼
我(U+6211)
(U+200B)
要編碼幹嘛
文字
電腦中的每個文字,都對應著一個二進位編碼
因為電腦看不懂文字,只看得懂二進位
所以我把一個文字對應到一種二進位編碼,電腦就能識別出來
ASCII
^D
統一標準
如果我有一套編碼系統,其中A對應著0001
然而有另一套編碼系統,其中A對應著0011
則這兩種編碼系統在通訊的時候,文字會變得混亂
所以需要一個統一的編碼系統來解決此問題
ASCII
最早是美國在做這件事
然後你就發現英文字母只有26個
大小寫考慮進去的話也只有52個
標點符號與其他控制字符也不多
所以ASCII就開了256的大小的字符集
裝了128個字符
剩下給西歐國家做自己需要的擴展
也就是EASCII
GBK
丂(0x8140)(U+4E02)
漢字
前面的ASCII只能存256個字符
而一個byte有8個bit,只有256種組合
然後漢字超多,所以GBK用的是兩個byte來存字元,也就是65536種組合
GB-2312-80
GBK是GB-2312-80的擴展,因為GB-2312-80實際上只收錄了6000多個常用漢字,而生僻字則無法顯示
無法顯示的話就會顯示成一個方框▯
這個方框不是GB-2312的字元,而是像仿宋黑體的字體會預留一個方框來應對這種問題,俗稱豆腐字
unicode
𒄃(U+12103)
😀(U+1F600)
�(U+FFFD)
大一統
目前的UNICODE收錄了154998種字元
其中包含了世界各國的文字
還有標題底下的一堆抽象的字元
UNICODE創立之前,很多國家都有自己的編碼系統,而且互不兼容
UNICODE的出現就是為了解決編碼系統衝突的現象
但我們等等就要實作編碼系統衝突
UTF-8 UTF-16
UTF-8: 以1~4個byte存取文字,將常用的文字用1個byte存取,節省空間
UTF-16: 以2或4個byte存取文字,對於較少見的文字,可以相較於UTF-8更節省空間
代理對
UTF-16 編碼中用來表示超過 U+FFFF 的字元。
UTF-16 本身是以2 byte為基礎,但 Unicode 的範圍到 U+10FFFF,
超過了2byte能直接表示的範圍。
因此,UTF-16 引入了代理對,用兩組2byte單元來表示一個字元。
bilibili的神奇影片標題
講師之前在B站刷到一個標題空白的影片
複製下來後發現是U+D835與U+DC38的組合
這兩個就是一個代理對,兩個組合起來的字元是𝐸(U+1D438)
但理論上你不能單獨打出一個高位代理或低位代理
所以很神奇
喔對了這個影片好像是個音樂MV
錕斤拷�
0xEFBFBD
錕斤拷
這個著名的編碼衝突來自GBK與UTF-8的衝突
當一個以GBK編碼儲存的文檔,以UTF-8編譯時
會產生錯誤,UTF-8就會用�(0xEFBFBD)替代
而此文檔再次用GBK打開時,��(EFBFBDEFBFBD)就會被當成EFBF, BDEF, BFBD三個字元,也就是錕斤拷
不是阿超怪
講師在實驗中發現,GBK轉UTF-8所產生的�並不是0xEFBFBD,而是0020(空格)
很怪
所以我們無法透過此方法產生大量的0xEFBFBD
但是我們可以直接複製�
notepad++
使用notepad++,將編碼改成UTF-8,複製貼上多個�
將編碼轉成GB2312
你就成功了


有趣的一些字元
U+200B,零寬空格,顧名思義,他是一個沒有寬度的空格
最開頭的標題底下就是這個
U+00A0,不換行空格,此字元打出來後,你會發現你的enter無法起到換行的作用
Minimal
By ck11300768鄭博軒
Minimal
- 60