計算機編碼:ASCII,Unicode 和 UTF-8
-
計算機編碼
計算機最小存儲單元爲bit(位),有0、1兩種狀態,最小運算單元爲Byte(字節),1 Byte = 8 * bit 。那麼1Byte就有256種二進制狀態,可以代表256種字符。如果規定好人們現實生活中的字符與數量(number)的映射關係那麼即可將人類語言存儲在計算機硬件上。
-
ASCII
ASSCII 是一個美國製定的映射標準。規定了 英文字符 <-> 數字 <->二進制表示 之間的關係。即可以將英文字符映射到byte上,ASSCII共規定了128個字符,正好使用1byte的後7個bit。第一位統一規定爲0
例如:空格
SPACE
是32(二進制00100000
) 大寫的字母
A
是65(二進制01000001
) 由於世界上不單單是隻有英文,所以也需要定義漢字,日文,拉丁文等多種符號集,每個國家都在ASCII基礎上定義了自己的編碼標準,將閒置的最高位利用起來可以表示256個字符,像漢字都是上萬的字符,單字節不夠,就需要用到第二個字節。但不管怎樣每個國家的標準都是獨自的,像130在法語編碼中代表了
é
,在希伯來語編碼中卻代表了字母Gimel
(ג
),這就導致了亂碼的發生,所以出現了一個大一統的標準,Unicode -
Unicode
將世界上主要符號都進行與數字的映射,一個符號對應唯一一個數學數字(通常用十六進制表示),由於範圍太大以至於對應的數字用二進制表示時,需要2個3個甚至4個字節。例如ucs-2 (unicode的一種實現方式,分爲大小端兩種)固定用兩個字節表示一個字符,那麼計算機每次都讀取兩個字節來存儲字符,記錄一個簡單字符時例如數字3,只用到了1個字節,那麼後1個字節補零,這對計算機空間是一種浪費,所以需要一種以Unicode映射關係爲基準又能根據字符動態調整佔用空間的編碼。現在互聯網主要標準爲utf-8。
-
UTF-8
由上述可知Unicode不適合做存儲與數據傳輸(空間浪費,帶寬浪費),而utf-8實現了一種將unicode規定的字符根據所佔用字節數動態存儲機制。UTF-8 是 Unicode 的實現方式之一。
UTF-8 最大的一個特點,就是它是一種變長的編碼方式。它可以使用1~4個字節表示一個符號,根據不同的符號而變化字節長度。
UTF-8 的編碼規則很簡單,只有二條:
1)對於單字節的符號,字節的第一位設爲
0
,後面7位爲這個符號的 Unicode 碼。因此對於英語字母,UTF-8 編碼和 ASCII 碼是相同的。2)對於
n
字節的符號(n > 1
),第一個字節的前n
位都設爲1
,第n + 1
位設爲0
,後面字節的前兩位一律設爲10
。剩下的沒有提及的二進制位,全部爲這個符號的 Unicode 碼。下表總結了編碼規則,字母
x
表示可用編碼的位。Unicode符號範圍(十六進制) UTF-8(二進制表示) 0000 0000 - 0000 007F 0xxxxxxx 0000 0080 - 0000 07FF 110xxxxx 10xxxxxx 0000 0800 - 0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 0001 0000 - 0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 如上,當用utf-8解釋編碼時,如果一個字節第一位時0則表示它單獨代表一個字符,如果是1那麼連續有多少個
1
,就表示當前字符佔用多少個字節‘嚴’的 Unicode 是
4E25
(100111000100101
),根據上表,可以發現4E25
處在第三行的範圍內(0000 0800 - 0000 FFFF
),因此嚴
的 UTF-8 編碼需要三個字節,即格式是1110xxxx 10xxxxxx 10xxxxxx
。然後,從嚴
的最後一個二進制位開始,依次從後向前填入格式中的x
,多出的位補0
。這樣就得到了,嚴
的 UTF-8 編碼是11100100 10111000 10100101
,轉換成十六進制就是`E4B8A5另外一個utf-8編碼的文件可以在文件頭用
EF BB BF
表示這是UTF-8編碼,後面緊跟數據,這樣的utf8編碼叫帶BOM(byte-order mark)的utf-8格式。 -
ucs-2、ANSI
-
ANSI
是默認的編碼方式。對於英文文件是ASCII
編碼,對於簡體中文文件是GB2312
編碼(只針對 Windows 簡體中文版,如果是繁體中文版會採用 Big5 碼) -
ucs-2
也是一種unicode的編碼方式,固定用兩個字節存儲字符的Unicode十六進制。根據兩個字節前後順序分大端(Big endian) 、小端(Little endian)以漢字
嚴
爲例,Unicode 碼是4E25
,需要用兩個字節存儲,一個字節是4E
,另一個字節是25
-
Big endian 時 :4E 25
-
Little endian時:25 4E
那麼 計算機怎麼知道某一個文件到底採用哪一種方式編碼?
Unicode 規範定義,每一個文件的最前面分別加入一個表示編碼順序的字符,這個字符的名字叫做"零寬度非換行空格"(zero width no-break space),用
FEFF
表示。這正好是兩個字節,而且FF
比FE
大1
。如果一個文本文件的頭兩個字節是
FE FF
,就表示該文件採用大頭方式;如果頭兩個字節是FF FE
,就表示該文件採用小頭方式。記事本另存爲 可實現轉換。
-
-
參考:
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html