常常咱們打開外國網站的時候出現亂碼,又或者打開不少非英語的外國網站的時候,顯示的都是口口口口口的字符,html
WordPress程序是用的UTF-8,不少cms用的是GB2312。程序員
● 爲何有這麼多編碼?算法
● UTF-8和GB2312有什麼區別?編程
● 咱們在國內作網站是用UTF-8編碼格式仍是GB2312編碼格式好? 瀏覽器
可能不少同窗一直對字符的各類編碼方式懵懵懂懂,根本搞不清爲何他們有這麼多編碼。服務器
ANSI編碼網絡
其實在好久好久之前,有一羣人,他們決定用8個能夠開合的晶體管來組合成不一樣的狀態,以表示世界上的萬物。他們看到8個開關狀態是好的,因而他們把這稱爲「字節」。學習
開始計算機只在美國用。八位的字節一共能夠組合出256(2的8次方)種不一樣的狀態。 優化
他們把其中的編號從0開始的32種狀態分別規定了特殊的用途,一但終端、打印機趕上約定好的這些字節被傳過來時,就要作一些約定的動做。網站
趕上00×10,終端就換行,趕上0×07, 終端就向人們嘟嘟叫,例好趕上0×1b, 打印機就打印反白的字,或者終端就用彩色顯示字母。他們看到這樣很好,因而就把這些0×20如下的字節狀態稱爲"控制碼"。
他們又把全部的空格、標點符號、數字、大小寫字母分別用連續的字節狀態表示,一直編到了第127號,這樣計算機就能夠用不一樣字節來存儲英語的文字了。你們看到這樣,都感受很好,因而你們都把這個方案叫作 ANSI 的"Ascii"編碼(American Standard Code for Information Interchange,美國信息互換標準代碼)。當時世界上全部的計算機都用一樣的ASCII方案來保存英文文字。
擴展ANSI編碼
後來,就像建造巴比倫塔同樣,世界各地的都開始使用計算機,可是不少國家用的不是英文,他們的字母裏有許可能是ASCII裏沒有的,爲了能夠在計算機保存他們的文字,他們決定採用127號以後的空位來表示這些新的字母、符號,還加入了不少畫表格時須要用下到的橫線、豎線、交叉等形狀,一直把序號編到了最後一個狀態255。從128到255這一頁的字符集被稱「擴展字符集」。今後以後,貪婪的人類再沒有新的狀態能夠用了,美國當時估計也沒想到還有別的國家要用計算機的。
GB2312編碼
當天朝人們獲得計算機時,已經沒有能夠利用的字節狀態來表示漢字,何況有6000多個經常使用漢字須要保存呢。天朝人民就不客氣地把那些127號以後的奇異符號們直接取消掉。
規定:一個小於127的字符的意義與原來相同,但兩個大於127的字符連在一塊兒時,就表示一個漢字,前面的一個字節(他稱之爲高字節)從0xA1用到0xF7,後面一個字節(低字節)從0xA1到0xFE,這樣咱們就能夠組合出大約7000多個簡體漢字了。
在這些編碼裏,咱們還把數學符號、羅馬希臘的字母、日文的假名們都編進去了,連在 ASCII 裏原本就有的數字、標點、字母都通通從新編了兩個字節長的編碼,這就是常說的「全角」字符,而原來在127號如下的那些就叫"半角"字符了。因而就把這種漢字方案叫作 「GB2312」。GB2312 是對 ASCII 的中文擴展。
GBK 和 GB18030編碼
可是天朝的漢字太多了,咱們很快就就發現有許多人的人名沒有辦法在這裏打出來,特別是某些天朝領導的名字要是打不出很麻煩的。因而咱們不得不繼續把 GB2312 沒有用到的碼位找出來老實不客氣地用上。
後來仍是不夠用,因而乾脆再也不要求低字節必定是127號以後的內碼,只要第一個字節是大於127就固定表示這是一個漢字的開始,無論後面跟的是否是擴展字符集裏的內容。結果擴展以後的編碼方案被稱爲 GBK 標準,GBK 包括了 GB2312 的全部內容,同時又增長了近20000個新的漢字(包括繁體字)和符號。
後來少數民族也要用電腦了,因而咱們再擴展,又加了幾千個新的少數民族的字,GBK 擴成了 GB18030。今後以後,天朝民族的文化就能夠在計算機時代中傳承了。
在這個標準裏,最大的特色是兩字節長的漢字字符和一字節長的英文字符並存於同一套編碼方案裏,所以他們寫的程序爲了支持中文處理,必需要注意字串裏的每個字節的值,若是這個值是大於127的,那麼就認爲一個雙字節字符集裏的字符出現了。
那時候凡是受過編程學習的程序員都要天天念下面這個咒語數百遍的折磨:
「一個漢字算兩個英文字符!一個漢字算兩個英文字符……」
UNICODE編碼
由於當時各個國家都像天朝這樣搞出一套本身的編碼標準,結果互相之間誰也不懂誰的編碼,誰也不支持別人的編碼,連大陸和臺灣這樣只相隔了150海里,使用着同一種語言的兄弟地區,也分別採用了不一樣的編碼方案:
當時的天朝人想讓電腦顯示漢字,就必須裝上一個「漢字系統」。專門用來處理漢字的顯示、輸入的問題。
可是那個裝臺灣的人士寫的程序就必須加裝另外一套支持 BIG5 編碼的「倚天漢字系統」才能夠用,裝錯了字符系統,顯示就會亂了套!這怎麼辦?並且世界民族中還有那些暫時用不上電腦的窮苦人民,他們的文字又怎麼辦?
正在這時,天使及時出現了——一個叫 ISO (國際標誰化組織)的國際組織決定着手解決這個問題。他們採用的方法很簡單:廢了全部的地區性編碼方案,從新搞一個包括了地球上全部文化、全部字母和符號的編碼!他們打算叫它 UCS, 俗稱 UNICODE 。( Universal Multiple-Octet Coded Character Set )
在UNICODE 中,一個漢字算兩個英文字符的時代已經快過去了。
不管是半角的英文字母,仍是全角的漢字,它們都是統一的「一個字符」!同時,也都是統一的「兩個字節"」
UTF-8和UTF-16
UNICODE 來到時,一塊兒到來的還有計算機網絡的興起,UNICODE 如何在網絡上傳輸也是一個必須考慮的問題,因而面向傳輸的衆多 UTF(UCS Transfer Format)標準出現了,顧名思義,UTF8就是每次8個位傳輸數據,而UTF16就是每次16個位,只不過爲了傳輸時的可靠性,從UNICODE到UTF時並非直接的對應,而是要過一些算法和規則來轉換。
將來的UCS-4
如前所述,UNICODE 是用兩個字節來表示爲一個字符,他總共能夠組合出65535不一樣的字符,這大概已經能夠覆蓋世界上全部文化的符號。若是還不夠也沒有關係,ISO已經準備了UCS-4方案,說簡單了就是四個字節來表示一個字符,這樣咱們就能夠組合出21億個不一樣的字符出來(最高位有其餘用途),這大概能夠用到天朝成立銀河聯邦成立那一天吧!
網頁亂碼是瀏覽器(如IE等)對HTML網頁解釋時造成的。
若是在瀏覽網站網頁的代碼寫錯語系(比較少見),有形如:
<HTML>
<HEAD>
<META CONTENT=「text/html;charset=ISO-8859-1」></HEAD>……
</HTML>
的語句,瀏覽器在顯示此頁時,就會出現亂碼。由於瀏覽器會將此頁語種辨認爲「歐洲語系」。
解決的辦法是將語種「ISO-8859-1」改成GB2312,若是是繁體網頁則改成BIG5。
還有一種可能比較大,就是網頁並無標明他用的是何種語系,即沒有
<META CONTENT=「text/html;charset=XXXXX「>,這一行。
而你的計算機默認也不是這種語系,比方咱們訪問某些日文網站,常常出現這個問題。這個主要是因爲程序員是面向當地的人開發的網站,因爲當地都是默認語系,因此沒有亂碼種狀況,而你是外來人,你的操做系統自己默認不是當地的語系。因此要手動改語系。
至於出現口口口口口口這種狀況
這是因爲網站並無採用UTF-8編碼而是採用的當地的編碼,如蒙古語的,阿拉伯語的編碼,你的計算機中並無這種編碼,因此不能識別。
解決辦法是,事先爲瀏覽器安裝多語言支持包(例如在安裝IE時要安裝多語言支持包),這樣在瀏覽網頁出現亂碼時,就能夠在瀏覽器中選擇菜單欄下的「查看」/「編碼」/「自動選擇」/蒙古),如爲繁體中文則選擇「查看」/「編碼」/「自動選擇」/阿拉伯語,其它語言依此類推選擇相應的語系,這樣可消除網頁亂碼現象。
咱們通常通俗的理解爲:
UTF-8是世界性通用代碼,也完美的支持中文編碼,若是咱們作的網站能讓國外用戶正常的訪問,就最好用UTF-8。
GB2312屬於中文編碼,主要針對國內用戶使用,若是國外用戶訪問GB2312編碼的網站就會變亂碼。
網友的反饋通常以爲是用UTF-8比GB2312要多不少,你們都比較贊同用UTF-8。
從一張外國網站的調查也可看得出:
由此圖能夠看出,2001-2008年期間,GB2312編碼的使用狀況雖然幅度不大,但仍是在穩定上升的;藍色的線表示出用UTF-8的網站愈來愈多了。
我挑選了國內部分幾個大的門戶網站,看看他們用的是哪一種編碼格式:
也許有同窗就會問了爲何國內幾個網站用GB2312反而更多些呢。
我也對這個疑問進行了思考,我以爲。應該有3種緣由:
1. 國內這些網站自己歷史也比較長,開始使用的就是 GB2312編碼,如今改爲 UTF-8(之前的網頁)轉換的難度和風險太大。
2. UTF-8編碼的文件比GB2312更佔空間一些,雖然目前的硬件環境下能夠忽略,可是這些門戶網站爲了減小服務器負載基本上全部的頁面都生成了靜態頁,UTF-8保存起來文件會比較大,對於門戶級別的網站天天生成的文件量仍是很是巨大,帶來的存儲成本相應提升。
3. 因爲UTF-8的編碼比GB2312解碼的網絡傳輸數據量要大,對於門戶級別的網站來講。這個無形之間就要增大帶寬,用GB2312對網絡流量無疑是最好的優化。
因此在新作站的狀況下,建議仍是選擇UTF-8比較好。由於沒有上面那些緣由,兼容爲上策。