-
1 # 宜動不動
-
2 # 老王丶分享
先來解釋一下這三種編碼的歷史吧:
ANSI:最早的時候計算機ASCII碼只能表示256個符號(含控制符號),這個字符集表示英文字母足夠,其中,我們鍵盤上可見的符號的編碼範圍是從32到126(大小寫英文字母、數字、英文符號等)。但表示漢字、日語、韓語就不太夠用了,漢字常用字有3000多個。
但是華人也要用電腦打字,於是,華人就研究出來了最早的中文字符集GB2312(GBK就是後來的擴充套件),GB2312的做法是,把ASC碼取值範圍的128~255這個區間挪用了一下,用兩個ASC碼錶示一個漢字,這樣可用的編碼範圍用十六進位制表示就是0x8080到0xFFFF,這大概能表示一萬多個符號,足夠了。[注:實際沒用那麼多,GBK的範圍是8140-FEFE]
那個時候,計算機技術還不發達,各個國家搞自己的,比如臺灣,也另搞了一套,叫BIG5(俗稱:大五碼),跟大陸的也不太一樣,但方法是類似的,都是用0x80到0xFF這個區間。
然後日語(有編碼JIS)、韓語等等也各搞一套。
這些國家的編碼區間都是重疊的,但同一個漢字(比如有一些漢字同時存在於簡體、繁體、日語漢字中)有不同的編碼,很混亂是不是?但也湊合用了。編碼不同導致了很多麻煩,比如一個網頁,如果你不知道它是什麼編碼的,那麼你可能很難確定它顯示的是什麼,一個字元可能是大陸簡體/臺灣繁體/日本漢字,但又完全是不同的幾個字。
所以如果用一些很老的軟體,可能會聽說有中文版/日文版之類的,對應的版本只能在對應的系統上執行。
後來,這個對作業系統的開發實在是太困難了,因為這意味著不同語言的版本,都要重新編碼。於是發明了Unicode。
Unicode這個東西,就是要把地球上所有的語言的符號,都用統一的字符集來表示,一個編碼真正做到了唯一。
Unicode裡有幾種方式:
UTF-16BE/LE:UTF-16就是Windows模式的編碼模式(Windows裡說的Unicode一般都是指這種編碼),用2個位元組表示任意字元,注意:英文字元也佔2個位元組(變態不?),這種編碼可以表示65536個字元,至於LE和BE,就是一個數值在記憶體/磁碟上的儲存方式,比如一個編碼0x8182,在磁碟上應該是0x81 0x82呢?還是0x82 0x81呢?就是高位是最先儲存還是最後儲存的問題,前者為BE,後者為LE。
UTF-8:UTF-8則是網頁比較流行的一種格式:用一個位元組表示英文字元,用3個位元組表示漢字,準確的說,UTF-8是用二進位制編碼的字首,如果某個UTF-8的編碼的第一個位元組的最高二進位制位是0,則這個編碼佔1位元組,如果是110,則佔2位元組,如果是1110,則佔3位元組……
好了,說了這麼,再來研究Windows的記事本。
Windows早期(至少是95年以前的事情了)是ANSI字符集的,也就是說一箇中文文字,在Windows簡體中文版顯示的是中文,到Windows日文版顯示的就不知道是什麼東西了。
後來,Windows支援了Unicode,但當時大部分軟體都是用ANSI編碼的,unicode還不流行,怎麼辦?Windows想了個辦法,就是允許一個預設語言編碼,就是當遇到一個字串,不是unicode的時候,就用預設語言編碼解釋。(在區域和語言選項裡可以改預設語言)
這個預設語言,在不同Windows語言版本里是不同的,在簡體中文版裡,是GBK,在繁體中文版裡,是BIG5,在日文版裡是JIS
而記事本的ANSI編碼,就是這種預設編碼,所以,一箇中文文字,用ANSI編碼儲存,在中文版裡編碼是GBK模式儲存的時候,到繁體中文版裡,用BIG5讀取,就全亂套了。
記事本也不甘心這樣,所以它要支援Unicode,但是有一個問題,一段二進位制編碼,如何確定它是GBK還是BIG5還是UTF-16/UTF-8?記事本的做法是在TXT檔案的最前面儲存一個標籤,如果記事本開啟一個TXT,發現這個標籤,就說明是unicode。標籤叫BOM,如果是0xFF 0xFE,是UTF16LE,如果是0xFE 0xFF則UTF16BE,如果是0xEF 0xBB 0xBF,則是UTF-8。如果沒有這三個東西,那麼就是ANSI,使用作業系統的預設語言編碼來解釋。
Unicode的好處就是,不論你的TXT放到什麼語言版本的Windows上,都能正常顯示。而ANSI編碼則不能。(UTF-8的好處是在網路環境下,比較節約流量,畢竟網路裡英文的資料還是最多的)
舉例:
同樣一段中文文字(可以插入一些英文),儲存成ANSI/Unicode/UTF-8,三個檔案。
修改windows的預設語言為日語之類的(WIN7的改法是:控制面板-時鐘、語言和區域-更改顯示語言-區域和語言-管理-非unicode程式語言-更改區域設定/WNIXP改法是:控制面板-區域和語言選項-非unicode程式語言)。
修改完要求重啟,重啟以後,再開啟這三個檔案,ANSI的編碼全亂了,其餘兩個都正常顯示,這就是UNICODE的作用。
另外,為什麼記事本、開始選單什麼的還是正確的中文呢?明明我已經改了預設語言了?因為它們的程式編碼也是unicode的。
要把txt發給國外的朋友或者用在非中文的作業系統/軟體裡,那麼你的編碼最好選擇unicode。
給非專業人士看的:
1. 各種字符集之間關係的問題,簡單的概況如下圖:
其中,GB系列的都屬於ANSI中最原始的編碼ASCII的擴充套件。ANSI簡單的可以看做各種非Unicode的編碼,特點是用不固定的長度表示字元,每個國家有每個國家的不同標準和擴充套件,處理起來非常麻煩。而Unicode作為一個新的字符集,用來相容各國不同的字符集標準,統一使用16bits來表示一個字元。 UTF-8則是Unicode底下的一種編碼格式,Unicode有多種編碼格式。 為啥又要設定多種編碼格式呢,因為某些情況一個字元用不到16bits這麼大的空間,會浪費,或者影響通訊效率等。 UTF-8的優勢是能夠靈活的處理這種情況。其中,GB系列的都屬於ANSI中最原始的編碼ASCII的擴充套件。ANSI簡單的可以看做各種非Unicode的編碼,特點是用不固定的長度表示字元,每個國家有每個國家的不同標準和擴充套件,處理起來非常麻煩。而Unicode作為一個新的字符集,用來相容各國不同的字符集標準,統一使用16bits來表示一個字元。 UTF-8則是Unicode底下的一種編碼格式,Unicode有多種編碼格式。 為啥又要設定多種編碼格式呢,因為某些情況一個字元用不到16bits這麼大的空間,會浪費,或者影響通訊效率等。 UTF-8的優勢是能夠靈活的處理這種情況。
2. 記事本設定這三種選擇,目的是為了相容以前老的ANSI文字(包括GBK,GB系列等)。 那麼記事本為啥不能自動識別和儲存呢,因為某種情況下會有歧義,這種歧義是沒法識別到底屬於哪種編碼格式的,Notepad++什麼的也一樣,而導致亂碼。
3. 一般較新的作業系統/程式預設都以Unicode字符集來儲存字元了,這是大勢,並且使用者採用Unicode下的編碼格式來儲存的話,處理起來也會有速度上的優勢。
回覆列表
所謂的「ANSI」指的是對應當前系統 locale 的遺留(legacy)編碼。
所謂的「Unicode」指的是帶有 BOM 的小端序 UTF-16。
所謂的「UTF-8」指的是帶 BOM 的 UTF-8。
UTF-8 是相容性最好的編碼格式,建議用 Notepad++ 等正常的專業文字編輯器儲存為不帶 BOM 的 UTF-8。