GB2312是對中國的開發人員來講很重要的一個詞彙,它的前因後果並不須要我在這裏贅述,隨便Goolge之便明白無誤。我只是想提一句,記得前一節說到編碼字符集和字符集編碼不是一回事,而有的字符集編碼又實際上沒有作任何事,GB2312正是這樣一種東西!html
GB2312最初指的是一個編碼字符集,其中包含了ASCII所包含的英文字符,同時加入了6763個簡體漢字以及其餘一些ASCII以外的符號。與Unicode有UTF-8和UTF-16同樣(固然, UTF-8和UTF-16也沒有被限定只能用來對Unicode進行編碼,實際上,你用它對視頻進行編碼都是能夠的,只是編出的文件沒有播放器支持罷了,哈哈),GB2312也有本身的編碼方案,但這個方案直接使用一個字符在GB2312中的編號做爲存儲值(與UTF-32的作法相似),也所以,這個編碼方案甚至沒有正式的名稱。咱們平常提及GB2312的時候,經常即指這個字符集,也指這種編碼方案。程序員
GBK是GB2312的後續標準,添加了更多的漢字和特殊符號,相似的是,GBK也是同時指他的字符集和他的編碼。瀏覽器
GBK仍是現現在中文Windows操做系統的系統默認編碼(這正是幾乎全部網頁上的,文件裏的亂碼問題的根源)。網站
咱們能夠這樣來驗證,使用如下的Java代碼:編碼
String encoding=System.getProperty("file.encoding");spa
System.out.println(encoding);操作系統
輸出結果爲GBKcode
(什麼?你的輸出不是這樣?怎麼可能?完了,個人牌子要砸了,等等,你用的繁體版XP?我說你這同志在這裏搗什麼亂?去!去!)視頻
說到GB2312和GBK就不得不提中文網頁的編碼。儘管不少新開發的Web系統和新上線的注重國際化的網站都開始使用UTF-8,仍有至關一部分的中文媒體堅持使用GB2312和GBK,例如新浪的頁面。其中有兩點很值得注意。htm
第一,頁面中meta標籤的部分,經常能夠見到charset=GB2312這樣的寫法,很不幸的是,這個「charset」實際上是用來指定頁面使用的是什麼字符集編碼,而不是使用什麼字符集。例如你見到過有人寫「charset=UTF-8」,見到過有人寫「charset=ISO-8859-1」,但你見過有人寫「charset=Unicode」麼?固然沒有,由於Unicode是一個字符集,而不是編碼。
然而正是charset這個名稱誤導了不少程序員,真的覺得這裏要指定的是字符集,也於是使他們進一步的誤覺得UTF-8和UTF-16是一種字符集!(萬惡啊)好在XML中已經作出了修改,這個位置改爲了正確的名稱:encoding.第二,頁面中說的GB2312,實際上並不真的是GB2312(驚訝麼?)。咱們來作個實驗,例如找一個GB2312中不存在的漢字「嚲」(這個字確實不在GB2312中,你能夠到GB2312的碼錶中去找,保證找不到),這個字在GBK中。而後你把它放到一個html頁面中,試着在瀏覽器中打開它,而後選擇瀏覽器的編碼爲「GB2312」,看到了什麼?它徹底正常顯示!
結論不用我說你也明白了,瀏覽器實際上使用的是GBK來顯示。
新浪的頁面中也有不少這樣的例子,處處都寫charset=GB2312,卻使用了無數個GB2312中並不存在的字符。這種作法對瀏覽器顯示頁面並不成問題,但在須要程序抓取頁面並保存的時候帶來了麻煩,程序將不能依據頁面所「聲稱」的編碼進行讀取和保存,而只能儘可能猜想正確的編碼。