用Notepad++建立一個文本文件text.txt,其默認編碼格式爲ANSI(乍看之下,還覺得是ASCII呢),輸入漢字竟然不是亂碼:
php
保存爲test.txt,發送給你美國的同事Bob。他也用Notepad++,不幸的是,卻發現你的文件內容是這樣的:
html
也許你會認爲:你用的是中文系統,能正常顯示中文;他用的是英文系統,不能顯示中文!python
這麼想,好像頗有道理呢!windows
可是再細想一下:一個系統顯示亂碼,說明它不支持這種編碼格式(或者解碼方式不對)。難道英文系統不支持ANSI?難道ANSI是一種中文編碼?編輯器
若是你身邊有一個韓文系統,也裝一個Notepad++,默認仍是ANSI編碼,你能夠輸入「한국어」,發現也能正常顯示:
可是你要輸入「漢字」可能就會發現是亂碼了...編碼
經過這個反例,就能夠說明ANSI不是一種中文編碼。那麼,ANSI究竟是什麼編碼?命令行
用十六進制編輯器打開內容爲「漢字」的test.txt文件:
你會發現:其中baba和d7d6正好是「漢」和「字」兩個字的GBK編碼值。 3d
一樣,用十六進制編輯器打開內容爲「한국어」的test.txt文件:
你會發現:其中c7d一、b1b9和beee正好是「한」、「국」和「어」三個字符的EUC-KR編碼值。 code
由此能夠看出:其實ANSI並非某一種特定的字符編碼,而是在不一樣的系統中,ANSI表示不一樣的編碼。你的美國同事Bob的系統中ANSI編碼實際上是ASCII編碼(ASCII編碼不能表示漢字,因此漢字爲亂碼),而你的系統中(「漢字」正常顯示)ANSI編碼實際上是GBK編碼,而韓文系統中(「한국어」正常顯示)ANSI編碼實際上是EUC-KR編碼。htm
話說計算機是由美國佬搞出來的嘛,他們以爲一個字節(能夠表示256個編碼)表示英語世界裏全部的字母、數字和經常使用特殊符號已經綽綽有餘了(其實ASCII只用了前127個編碼)。後來歐洲人不幹了,法國人說:我須要在小寫字母加上變音符號(如:é),德國人說:我也要加幾個字母(Ä ä、Ö ö、Ü ü、ß)。因而,歐洲人就將ASCII沒用完的編碼(128-255)爲本身特有的符號編碼(後來稱之爲「擴展字符集」)。等到咱們中國人開始使用計算機的時候,尼瑪,256個編碼哪夠?我泱泱大中華,漢字起碼也得N多萬吧,就連小學生都得要求掌握兩三千字。國標局最後拍板:一個字節不夠,那咱們就用多個字節來爲漢字編碼吧,可是,國情那麼窮,字節那麼貴,三個字節傷不起,那就用倆字節吧,先給經常使用的幾千漢字編個碼,等之後國家強盛了人民富裕了,咱再擴展唄---因而GB2312就產生了。臺灣同胞一看,尼瑪,全是簡體字,還讓不讓咱們寫繁體字的活了,因而臺灣同胞也本身弄了個繁體字編碼---大五碼(Big-5)。同時,其它國家也在爲本身的文字編碼。最後,微軟苦逼了:顧客就是上帝啊,大家的編碼我都得知足啊,這樣吧,賣給美國國內的系統默認就用ASCII編碼吧,賣給中國人的系統默認就用GBK編碼吧,賣給韓國人的系統默認就用EUC-KR編碼,...可是爲了不大家誤會我賣給大家的系統功能有差別,我就統一把大家的默認編碼都顯示成ANSI吧。---本故事純屬虛構,但「ANSI編碼」確實只存在於Windows系統。
那麼Windows系統是如何區分ANSI背後的真實編碼的呢?
微軟用一個叫「Windows code pages」(在命令行下執行chcp命令能夠查看當前code page的值)的值來判斷系統默認編碼,好比:簡體中文的code page值爲936(它表示GBK編碼,win95以前表示GB2312,詳見:Microsoft Windows' Code Page 936),繁體中文的code page值爲950(表示Big-5編碼)。
咱們可否經過修改Windows code pages的值來改變「ANSI編碼」呢?
命令提示符下,咱們能夠經過chcp命令來修改當前終端的active code page,例如:
(1) 執行:chcp 437,code page改成437,當前終端的默認編碼就爲ASCII編碼了(漢字就成亂碼了);
(2) 執行:chcp 936,code page改成936,當前終端的默認編碼就爲GBK編碼了(漢字又能正常顯示了)。
上面的操做只在當前終端起做用,並不會影響系統默認的「ANSI編碼」。(更改命令行默認codepage參看:設置cmd的codepage的方法)。
Windows下code page是根據當前系統區域(locale)來設置的,要想修改系統默認的「ANSI編碼」,咱們能夠經過修改系統區域來實現(「控制面板」 =>「時鐘、語言和區域」=>「區域和語言」=>「管理」=>「更改系統區域設置...」):
圖中的系統locale爲簡體中文,意味着當前「ANSI編碼」實際是GBK編碼。當你把它改爲Korean(Korea)時,「ANSI編碼」實際是EUC-KR編碼,「한국어」就能正常顯示了;當你把它改爲English(US)時,「ANSI編碼」實際是ASCII編碼,「漢字」和「한국어」都成亂碼了。(改了以後須要重啓系統的。。。)
說明:locale是國際化與本地化中重要的概念,本文不深刻講解該內容。
你上面說的都是windows的情形吧,Linux呢?
將前述內容爲「漢字」的文件test.txt拷貝至Linux下,用Emacs打開:
也是亂碼!緣由也是locale的問題:
更改locale後再打開:
正常顯示了。。。
參考: