深入理解字符編碼(ASCII、Unicode、UTF-8、UTF-16、UTF-32)
大家都知道,程序中的所有信息都是以二進制的形式存儲在計算機的底層的,也就是說我們在代碼中定義的一個 char 字符或者一個 int 整數(shù)都會被轉(zhuǎn)換成二進制碼儲存起來,這個過程可以被稱為編碼,而將計算機底層的二進制碼轉(zhuǎn)換成屏幕上有意義的字符(如“hello world”),這個過程就稱為解碼。
ASCII 編碼

é,又制定了 ASCII 額外擴展的版本 EASCII,這里就可以使用一個完整子節(jié)的 8 個 bit 位表示共 256 個字符,其中就又包括了一些衍生的拉丁字母。
非 ASCII 編碼
"一個漢字算兩個英文字符!一個漢字算兩個英文字符……"

é,在希伯來語編碼中卻代表了字母 Gimel (?),在俄語編碼中又會代表另一個符號。但是所有這些編碼方式中,0--127 表示的符號依然都是一樣的,因為他們都兼容 ASCII 碼,這一點,如今也是一樣。Unicode
碼點

Unicode 編碼

定長與變長
大富大貴沒有災(zāi)難要小心
大富大貴,沒有災(zāi)難要小心
大富大貴沒有,災(zāi)難要小心
UTF-32
00000000 00000000 00000000 01000001
UTF-8
0,后面 7 位為這個符號的 Unicode 碼。此時,對于英語字母UTF-8 編碼和 ASCII 碼是相同的。n 字節(jié)的符號(n > 1),第一個字節(jié)的前 n 位都設(shè)為 1,第 n + 1 位設(shè)為0,后面字節(jié)的前兩位一律設(shè)為 10。剩下的沒有提及的二進制位,全部為這個符號的 Unicode 碼,如下表所示:

1,則連續(xù)有多少個 1,就表示當(dāng)前字符占用多少個字節(jié),"丑" 有三個 1 表示占三個字符,然后取出有效位即可。UTF-16
何為代理?
什么是代理區(qū)?


從 UTF-16 轉(zhuǎn)換為字符代碼的算法是什么?
BMP 中直接對應(yīng),無須做任何轉(zhuǎn)換; 增補平面 SP 中,則需要做相應(yīng)的計算。其實由上圖中的表也可看出,碼點就是從上到下,從左到右排列過去的,所以只需做個簡單的除法,拿到除數(shù)和余數(shù)即可確定行與列。 拿到一個碼點,先減去 10000,再除以 400(=1024)就是所在行了,余數(shù)就是所在列了,再加上行與列所在的起始值,就得到了代理對了。




評論
圖片
表情
