計算機中儲存的信息都是用二進制數表示的;而咱們在屏幕上看到的英文、漢字等字符是二進制數轉換以後的結果。通俗的說,按照何種規則將字符存儲在計算機中,如'a'用什麼表示,稱爲"編碼";反之,將存儲在計算機中的二進制數解析顯示出來,稱爲"解碼",如同密碼學中的加密和解密。在解碼過程當中,若是使用了錯誤的解碼規則,則致使'a'解析成'b'或者亂碼。html
字符集(Charset):是一個系統支持的全部抽象字符的集合。字符是各類文字和符號的總稱,包括各國家文字、標點符號、圖形符號、數字等。瀏覽器
字符編碼(Character Encoding):是一套法則,使用該法則可以對天然語言的字符的一個集合(如字母表或音節表),與其餘東西的一個集合(如號碼或電脈衝)進行配對。即在符號集合與數字系統之間創建對應關係,它是信息處理的一項基本技術。一般人們用符號集合(通常狀況下就是文字)來表達信息。而以計算機爲基礎的信息處理系統則是利用元件(硬件)不一樣狀態的組合來存儲和處理信息的。元件不一樣狀態的組合能表明數字系統的數字,所以字符編碼就是將符號轉換爲計算機能夠接受的數字系統的數,稱爲數字代碼。服務器
由於計算機只能處理數字,若是要處理文本,就必須先把文本轉換爲數字才能處理。最先的計算機在設計時採用8個比特(bit)做爲一個字節(byte),因此,一個字節能表示的最大的整數就是255(二進制11111111=十進制255),若是要表示更大的整數,就必須用更多的字節。好比兩個字節能夠表示的最大整數是65535,4個字節能夠表示的最大整數是4294967295。ide
因爲計算機是美國人發明的,所以,最先只有127個字符被編碼到計算機裏,也就是大小寫英文字母、數字和一些符號,這個編碼表被稱爲ASCII編碼,好比大寫字母A的編碼是65,小寫字母z的編碼是122。編碼
可是要處理中文顯然一個字節是不夠的,至少須要兩個字節,並且還不能和ASCII編碼衝突,因此,中國製定了GB2312編碼,用來把中文編進去。加密
你能夠想獲得的是,全世界有上百種語言,日本把日文編到Shift_JIS裏,韓國把韓文編到Euc-kr裏,各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。設計
爲了解決這個問題,一個偉大的創想產生了——Unicode。Unicode編碼系統爲表達任意語言的任意字符而設計。它使用4字節的數字來表達每一個字母、符號,或者表意文字(ideograph)。每一個數字表明惟一的至少在某種語言中使用的符號。(並非全部的數字都用上了,可是總數已經超過了65535,因此2個字節的數字是不夠用的。)被幾種語言共用的字符一般使用相同的數字來編碼,除非存在一個在理的語源學(etymological)理由使不這樣作。不考慮這種狀況的話,每一個字符對應一個數字,每一個數字對應一個字符。即不存在二義性。再也不須要記錄"模式"了。U+0041老是表明'A',即便這種語言沒有'A'這個字符。code
在計算機科學領域中,Unicode(統一碼、萬國碼、單一碼、標準萬國碼)是業界的一種標準,它可使電腦得以體現世界上數十種文字的系統。Unicode 是基於通用字符集(Universal Character Set)的標準來發展,而且同時也以書本的形式1對外發表。Unicode 還不斷在擴增, 每一個新版本插入更多新的字符。直至目前爲止的第六版,Unicode 就已經包含了超過十萬個字符(在2005年,Unicode 的第十萬個字符被採納且承認成爲標準之一)、一組可用以做爲視覺參考的代碼圖表、一套編碼方法與一組標準字符編碼、一套包含了上標字、下標字等字符特性的枚舉等。Unicode 組織(The Unicode Consortium)是由一個非營利性的機構所運做,並主導 Unicode 的後續發展,其目標在於:將既有的字符編碼方案以Unicode 編碼方案來加以取代,特別是既有的方案在多語環境下,皆僅有有限的空間以及不兼容的問題。htm
(能夠這樣理解:用通訊理論的思路能夠理解爲:
unicode是信源編碼,對字符集數字化;
utf8是信道編碼,爲更好的存儲和傳輸。)blog
新的問題又出現了:若是統一成Unicode編碼,亂碼問題今後消失了。可是,若是你寫的文本基本上所有是英文的話,用Unicode編碼比ASCII編碼須要多一倍的存儲空間,在存儲和傳輸上就十分不划算。
因此,本着節約的精神,又出現了把Unicode編碼轉化爲「可變長編碼」的UTF-8編碼。UTF-8編碼把一個Unicode字符根據不一樣的數字大小編碼成1-6個字節,經常使用的英文字母被編碼成1個字節,漢字一般是3個字節,只有很生僻的字符纔會被編碼成4-6個字節。若是你要傳輸的文本包含大量英文字符,用UTF-8編碼就能節省空間:
字符 | ASCII | Unicode | UTF-8 |
---|---|---|---|
A | 01000001 | 00000000 01000001 | 01000001 |
中 | x | 01001110 00101101 | 11100100 10111000 10101101 |
從上面的表格還能夠發現,UTF-8編碼有一個額外的好處,就是ASCII編碼實際上能夠被當作是UTF-8編碼的一部分,因此,大量只支持ASCII編碼的歷史遺留軟件能夠在UTF-8編碼下繼續工做。
搞清楚了ASCII、Unicode和UTF-8的關係,咱們就能夠總結一下如今計算機系統通用的字符編碼工做方式:
在計算機內存中,統一使用Unicode編碼,當須要保存到硬盤或者須要傳輸的時候,就轉換爲UTF-8編碼。
用記事本編輯的時候,從文件讀取的UTF-8字符被轉換爲Unicode字符到內存裏,編輯完成後,保存的時候再把Unicode轉換爲UTF-8保存到文件:
瀏覽網頁的時候,服務器會把動態生成的Unicode內容轉換爲UTF-8再傳輸到瀏覽器:
因此你看到不少網頁的源碼上會有相似
的信息,表示該網頁正是用的UTF-8編碼。
主要引用地址:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431664106267f12e9bef7ee14cf6a8776a479bdec9b9000
http://www.cnblogs.com/skynet/archive/2011/05/03/2035105.html