一、概念
我們知道計算機是基于二進制來表示數據的,那么對于字母和漢字等字符用二進制如何表示?
這就需要用一種編碼方式將這些字母或者符號轉換二進制表示。首先需要對字符集進行編碼表示,每個編碼代表一個固定的字符,然后再將字符的編碼轉換成二進制表示。
計算機常用字符的編碼主要分為兩種:Unicode碼與ASCII碼。
二、Unicode
Unicode 是一種標準的編碼系統,可以用于幾乎所有語言的字符的編碼,Unicode的出現是因為ASCII等其他編碼不能適應更多的字符編碼需求。
每個字符使用 0 和 0x10FFFF 之間的唯一整數碼位進行編碼,而其中編碼就是一個將一組 Unicode 字符轉換為一個字節序列的過程。
2.1 編碼方式
Unicode 標準為所有字符都分配一個碼位,其中Unicode 轉換格式 (UTF) 是一種碼位編碼方式。有三種編碼方式,如下所示:
UTF-8,它將每個碼位表示為一個由 1 至 4 個字節組成的序列,極少數用4~6個字節存儲。它的規則如下: 1)對于單字節的符號,字節的第一位設為0,后面7位為這個符號的unicode碼。 2)對于n字節的符號(n>1),第一個字節的前n位都設為1,第n+1位設為0,后面字節的前兩位一律設為10。剩下的沒有提及的二進制位,全部為這個符號的unicode碼。
在C#中,System.Text.Encoding.Unicode與System.Text.Encoding.UTF8的區別:Windows默認的Unicode實現是UTF-16,所以C#中Encoding.Unicode就是UTF-16,與UTF8不同。
UTF-16,介于 UTF-8 和 UTF-32 之間,使用 2 個或者 4 個字節來存儲,長度既固定又可變。UTF-16是分區定義的,每個區可以存放 65536 個字符,為1個平面,共有17個平面。分為基本平面BMP 和輔助平面SMP。常見的字符都在BMP中。
UTF-32,一種固定長度的編碼方案,不管字符編號大小,始終使用 4 個字節來存儲。
中文對應的Unicode編碼見:http://www.chi2ko.com/tool/CJK.htm
BOM(Byte Order Mark)是用來區分字節序列和編碼方式的(UTF-8,UTF-16,UTF-32)。
三、 ASCII
ASCII(American Standard Code for Information Interchange,美國信息互換標準代碼)是一套基于拉丁字母的字符編碼。
我們都知道,一個字節由8位二進制數構成,所以1個字節共有2的8次方種組合。如果每一種方式可以表示一個字符的話,那么1字節可以表示256個字符。ASCII 碼就是描述英文字符和8 位二進制數的對應關系。
ASCII 碼對照表定義了 128 個字符,包含 33 個控制字符和 95 個可顯示字符。
ASCII 碼對照表
徹底弄懂 Unicode 編碼