在系統管理或一些軟件管理中,老是碰到須要設置字符集或字符編碼的地方,若是設置不正確,可能產生許多意想不到的問題。網絡
可是在具體概念上,不只本身,網絡上也有不少人不太理解「字符集」和「字符編碼」究竟是不是一回事,或者究竟有啥不同?ide
查了些資料,加上本身的理解,作一個學習總結以下:學習
字符集與字符編碼有很緊密的聯繫,但不能徹底劃等號,先解釋下幾個概念: 編碼
字符(Character)spa
字符是各類文字和符號的總稱,包括各國家文字、標點符號、圖形符號等。如英文字母a-z,數字0-9,漢字等。code
字符集(CharacterSet)ci
字符集顧名思義,就是不一樣字符的集合。固然還包括一套將人類閱讀的字符轉換爲機器閱讀的字符(0或1)的規則。it
一個字符集包含了固定數量的字符,如ASCII字符集包含A-Z、a-z、0-9、半角標點符號和特殊控制符號(如換行符)在內的128個字符;如GB2312是中國國家標準的簡體中文字符集,覆蓋99.75%的漢字等。字符編碼
字符編碼(Encode)table
字符編碼,就是上面提到的將人類閱讀的字符按照必定的方式轉換爲機器閱讀字符(0或1)。這套映射規則就叫字符編碼,字符編碼是基於字符集的。
一套字符集能夠只有一套編碼規則,也能夠有多種編碼規則。有些字符集只有一套編碼規則,並且名字和字符集名稱一致。
從上能夠看出,字符集是規定字符的集合,字符編碼是把字符集的實現方式。
先看下字符的存儲方式。看下錶
字符編碼 |
每一個字符字節數 |
ASCII |
1 |
UCS-2(Unicode) |
2 |
UCS-4(Unicode) |
4 |
UTF-8(Unicode) |
1 - 6 |
UTF-16(Unicode) |
2 - 4 |
GBK/GB2312(中文) |
1 - 2 |
GB18030(CJK) |
1 - 4 |
表(1)
從上表能夠看出,不一樣的字符編碼用不一樣的方式表達字符集。
因此,根據所須要的字節數不一樣,把恆用2個字節表示一個字符的字符集(編碼),叫作雙字節字符集(Double-Byte Character Set,DBCS),其餘的叫作多字節字符集(Multi-Byte Character Set,MBCS)。如上表中只有UCS-2纔是DBCS字符集。
常見的字符集
Unicode:也叫統一字符集,它包含了幾乎世界上全部的已經發現且須要使用的字符(如中文、日文、英文、德文等)。
ASCII:早期的計算機系統只能處理英文,因此ASCII也就成爲了計算機的缺省字符集,包含了英文所須要的全部字符。
GB2312:中文字符集,包含ASCII字符集。ASCII部分用單字節表示,剩餘部分用雙字節表示。
GBK:GB2312的擴展,但完整包含了GB2312的全部內容。
GB18030:GBK字符集的超集,常叫大漢字字符集,也叫CJK(Chinese,Japanese,Korea)字符集,包含了中、日、韓三國語言中的全部字符。
常見的字符編碼,如utf八、GBK、GB23十二、Big5等。見表(1)
字符集轉換
從一種字符集轉換到另外一種字符集,因爲原先字符集中的某些字符可能並不包含在目標字符集中,因此有可能會致使某些字符丟失。
例如GBK轉換成ASCII字符集,就會致使除了單字節字符(ASCII部分)外的全部字符丟失。
注意,計算機上以ASCII方式(其實,ASCII表明了全部的MBCS字符集)儲存文件雖然能夠儲存中文,但實質上是由於GB2312和GBK等字符集是MBCS字符集,因此才歸類到ASCII中,其實本質上仍是是GBK字符集而不是ASCII字符集。
字符編碼轉換
因爲字符編碼是基於字符集的,因此字符編碼不一樣也可能致使部分字符丟失。但若是是相同字符集裏的不一樣編碼,例如UTF-8(Unicode)到UTF-16(Unicode)編碼,那麼是不會丟失的,由於它們是同一種字符集的不一樣表現形式。
由此咱們瞭解,字符集只是定義了一些包含不一樣字符的集合和一些映射方式,即字符編碼。字符編碼纔是給咱們使用的具體方式。
因此,咱們在系統管理中常常所設置的UTF-8、GB2312等都是字符編碼。