回覆列表
  • 1 # 宜動不動

    所謂的「ANSI」指的是對應當前系統 locale 的遺留(legacy)編碼。

    所謂的「Unicode」指的是帶有 BOM 的小端序 UTF-16。

    所謂的「UTF-8」指的是帶 BOM 的 UTF-8。

    UTF-8 是相容性最好的編碼格式,建議用 Notepad++ 等正常的專業文字編輯器儲存為不帶 BOM 的 UTF-8。

  • 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下的編碼格式來儲存的話,處理起來也會有速度上的優勢。

  • 中秋節和大豐收的關聯?
  • 如何看待不送寵物去醫院的行為?