1. 程式人生 > 其它 >Unicode與字元編碼

Unicode與字元編碼

背景

升級專案的Unity版本到2020,之前擴充套件的文字元件超連結功能不能用了,因為TextGenerator改版了,以前空白字元和富文字標籤是有頂點資料的,現在沒有了,導致字元和頂點資訊對應不上了。解決的期間發現有的字元會被拆成兩個char,感到不解,於是有了下文的總結。

總結

字符集規定字元和數字的對映關係。
字元編碼規定字元如何編碼、儲存。

Unicode是字符集,UTF-8是字元編碼。

UTF:Unicode Transformation Format,Unicode轉換格式。

程式碼點(code point,碼位):Unicode規定的,用來對映字元的數字。但一個字元可能由多個程式碼點組成。比如 é 是由兩個程式碼點 \u0065\u0301 組成的。

程式碼單元(code unit,碼元):一個編碼模型中,用來代表字元的最小的位元組單位。比如UTF-8,程式碼單元就是1個位元組(8個位元位)。

BOM(Byte Order Mark) 位元組序標記:字元“Zero Width No-Break Space”,零寬度非換行空格,FEFF。如果是FE FF,則為大端;如果是反過來FF FE,則為小端。

大端(Big endian)和小端(Little endian):按位元組,不是按位。從左到右,從高位到低位,則為大端,記憶體低地址處放高位。反之為小端。大端的好處是可以提前判斷報文資訊,小端適用於加法運算,因為有進位。
下面這段程式碼可以用來測試一下你的編譯器是大端模式還是小端模式:

short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址單元
x1=((char*)&x)[1]; //高地址單元

計算機中的大端小端是什麼?
大小端模式

UTF-8:變長編碼,1-6個位元組表示。具體規則網上很多,大致是零平面用0開頭,其他平面第一個位元組用前面連續的幾個1表示總共需要幾個位元組表示這個字元,然後用一個0隔開,後面幾個位元組用10開頭,剩餘位依次填充碼點位元位:

UTF-16:把Unicode字符集的抽象碼對映為16個位元位的整數,C# 中的 char 就是16位的。第零平面用8位即可滿足(65536個)。其他平面,即輔助平面,用兩個16位元的整數的代理對實現。

代理對(surrogate pair):UTF-16中,16個位元位不足以對映所有的Unicode字元。所以,第零平面保持原本的對映,用16位表示。輔助平面需要20位來表示,則用兩個16位整數表示。具體方法是: