近日需要不一樣的編碼,關於上述編碼,一直迷迷糊糊,查了些資料,總算大體瞭解了,
如下全是從網上搜來的:算法
1. ASCII和Ansi編碼
字符內碼(charcter code)指的是用來表明字符的內碼.讀者在輸入和存儲文檔時都要使用內碼,內碼分爲
單字節內碼 -- Single-Byte character sets (SBCS),可以支持256個字符編碼.
雙字節內碼 -- Double-Byte character sets)(DBCS),可以支持65000個字符編碼.
前者即爲ASCII編碼,後者相應ANSI.
至於中文簡體編碼GB2312,實際上它是ANSI的一個代碼頁936
2. Unicode
如上,ANSI有很是多代碼頁,使用不一樣代碼頁的內碼沒法在其它代碼也正常顯示,這就是爲何日文版/繁體中文版遊戲沒法在中文簡體平臺直接顯示的緣由.
Unicode也是一種字符編碼方法,只是它是由國際組織設計,可以容納全世界所有語言文字的編碼方案.它是一種2字節編碼,可以提供65536個字符,這個數字是不夠表示所有的字符的(漢語就有55000多字符),因此,經過一個代理對的機制來實現附加的917,476個字符表示,以達到所有字符都具備惟一編碼.
3.Unicode和BigEndianUnicode
這二者僅僅是存儲順序不一樣,如"A"的unicode編碼爲65 00
其BigEndianUnicode編碼爲00 65
4. UTF-8
這是爲傳輸而設計的編碼,其系列還有UTF-7和UTF-16
當中UTF-16和Unicode編碼大體同樣, UTF-8就是以8位爲單元對Unicode進行編碼。從Unicode到UTF-8的編碼方式例如如下:
Unicode編碼(16進制) UTF-8 字節流(二進制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
好比「漢」字的Unicode編碼是6C49。6C49在0800-FFFF之間,因此確定要用3字節模板了:1110xxxx 10xxxxxx 10xxxxxx。將6C49寫成二進制是:0110 110001 001001, 用這個比特流依次取代模板中的x,獲得:11100110 10110001 10001001,即E6 B1 89。
windows
ANSI:系統預設的標準文字儲存格式。ANSI是American National Standards Institute的縮寫。它成立於1918年,是一個自願性的組織,擁有超過1300個會員,包含所有大型的電腦公司。ANSI專爲電腦工業創建標準,它是世界上至關重要的標準。
Unicode:世界上所有主要指令文件的聯集,包含商業和我的電腦所使用的公用字集。當採用Unicode格式儲存文件時,可以使用Unicode控制字符輔助說明語言的文字覆蓋範圍,如阿拉伯語、希伯來語。用戶在「記事本」中輸入含有Unicode字符的文字並儲存文件時,系統會提示你必須選取「另存爲」中的Unicode編碼,這些字符纔不會被遺失。需要提醒你們的是,部分Windows 2000字型沒法顯示所有的Unicode字符。假設發現文件裏缺乏了某些字符,僅僅需將其變動爲其餘字型就能夠。
Unicode big endian:在Big-endian處理器(如蘋果Macintosh電腦)上創建的Unicode文件裏的文字位元組(存放單位)排列順序,與在Intel處理器上創建的文件的文字位元組排列順序相反。最重要的位元組擁有最低的地址,且會先儲存文字中較大的一端。爲使這類電腦的用戶能夠存取你的文件,可選擇Unicode big-endian格式。
UTF-8:UTF意爲通用字集轉換格式(Universal Character Set Transformation Format),UTF-8是Unicode的8位元格式。假設使用僅僅能在同類位元組內支持8個位元的重要資料一類的舊式傳輸媒體,可選擇UTF-8格式。
安全
Unicode是一種字符編碼規範 。
先從ASCII提及。ASCII是用來表示英文字符的一種編碼規範,每個ASCII字符佔用1個字節(8bits)
所以,ASCII編碼可以表示的最大字符數是256,事實上英文字符並無那麼多,通常僅僅用前128個(最高位爲0),當中包含了控制字符、數字、大寫和小寫字母和其它一些符號
。
而最高位爲1的另128個字符被成爲「擴展ASCII」,通常用來存放英文的製表符、部分音標字符等等的一些其它符號
這樣的字符編碼規範顯然用來處理英文沒有什麼問題
。(實際上也可以用來處理法文、德文等一些其它的西歐字符,但是不能和英文通用),但是面對中文、阿拉伯文之類複雜的文字,255個字符顯然不夠用
因而,各個國家紛紛制定了本身的文字編碼規範,當中中文的文字編碼規範叫作「GB2312-80」,它是和ASCII兼容的一種編碼規範,事實上就是利用擴展ASCII沒有真正標準化這一點,把一箇中文字符用兩個擴展ASCII字符來表示。
但是這種方法有問題,最大的問題就是,中文文字沒有真正屬於本身的編碼,因爲擴展ASCII碼儘管沒有真正的標準化,但是PC裏的ASCII碼仍是有一個事實標準的(存放着英文製表符),因此很是多軟件利用這些符號來畫表格。這樣的軟件用到中文系統中,這些表格符就會被誤認做中文字,破壞版面。而且,統計中英文混合字符串中的字數,也是比較複雜的,咱們必須推斷一個ASCII碼是否擴展,以及它的下一個ASCII是否擴展,而後才「猜」那多是一箇中文字
。
總之當時處理中文是很是痛苦的。而更痛苦的是GB2312是國家標準,臺灣當時有一個Big5編碼標準,很是多編碼和GB是一樣的,因此……,嘿嘿。
這時候,咱們就知道,要真正解決中文問題,不能從擴展ASCII的角度入手,也不能僅靠中國一家來解決。而必須有一個全新的編碼系統,這個系統要可以將中文、英文、法文、德文……等等所有的文字統一塊兒來考慮,爲每個文字都分配一個單獨的編碼,這樣纔不會有上面那種現象出現。
因而,Unicode誕生了。
Unicode有兩套標準,一套叫UCS-2(Unicode-16),用2個字節爲字符編碼,還有一套叫UCS-4(Unicode-32),用4個字節爲字符編碼。
以眼下常用的UCS-2爲例,它可以表示的字符數爲2^16=65535,基本上可以容納所有的歐美字符和絕大部分的亞洲字符
。
UTF-8的問題後面會提到 。
在Unicode裏,所有的字符被一視同仁。漢字再也不使用「兩個擴展ASCII」,而是使用「1個Unicode」,注意,現在的漢字是「一個字符」了,因而,拆字、統計字數這些問題也就天然而然的攻克了
。
但是,這個世界不是理想的,不可能在一晚上之間所有的系統都使用Unicode來處理字符,因此Unicode在誕生之日,就必須考慮一個嚴峻的問題:和ASCII字符集之間的不兼容問題。
咱們知道,ASCII字符是單個字節的,比方「A」的ASCII是65。而Unicode是雙字節的,比方「A」的Unicode是0065,這就形成了一個很是大的問題:之前處理ASCII的那套機制不能被用來處理Unicode了
。
還有一個更加嚴重的問題是,C語言使用'/0'做爲字符串結尾,而Unicode裏偏偏有很是多字符都有一個字節爲0,這樣一來,C語言的字符串函數將沒法正常處理Unicode,除非把世界上所有用C寫的程序以及他們所用的函數庫所有換掉
。
因而,比Unicode更偉大的東東誕生了,之因此說它更偉大是因爲它讓Unicode再也不存在於紙上,而是真實的存在於咱們你們的電腦中。那就是:UTF
。
UTF= UCS Transformation Format UCS轉換格式
它是將Unicode編碼規則和計算機的實際編碼相應起來的一個規則。現在流行的UTF有2種:UTF-8和UTF-16
。
當中UTF-16和上面提到的Unicode自己的編碼規範是一致的,這裏很少說了。而UTF-8不一樣,它定義了一種「區間規則」,這樣的規則可以和ASCII編碼保持最大程度的兼容
。
UTF-8有點類似於Haffman編碼,它將Unicode編碼爲00000000-0000007F的字符,用單個字節來表示;
00000080-000007FF的字符用兩個字節表示
00000800-0000FFFF的字符用3字節表示
因爲眼下爲止Unicode-16規範沒有指定FFFF以上的字符,因此UTF-8最可能是使用3個字節來表示一個字符。但理論上來講,UTF-8最多需要用6字節表示一個字符。
在UTF-8裏,英文字符仍然跟ASCII編碼同樣,所以原先的函數庫可以繼續使用。而中文的編碼範圍是在0080-07FF之間,所以是2個字節表示(但這兩個字節和GB編碼的兩個字節是不一樣的),用專門的Unicode處理類可以對UTF編碼進行處理。
如下說說中文的問題。
因爲歷史的緣由,在Unicode以前,一共存在過3套中文編碼標準。
GB2312-80,是中國大陸使用的國家標準,當中一共編碼了6763個常用簡體漢字。Big5,是臺灣使用的編碼標準,編碼了臺灣使用的繁體漢字,大概有8千多個。HKSCS,是中國香港使用的編碼標準,字體也是繁體,但跟Big5有所不一樣。
這3套編碼標準都採用了兩個擴展ASCII的方法,所以,幾套編碼互不兼容,而且編碼區間也各有不一樣
因爲其不兼容性,在同一個系統中同一時候顯示GB和Big5基本上是不可能的。當時的南極星、RichWin等等軟件,在本身主動識別中文編碼、本身主動顯示正確編碼方面都作了很是多努力
。
他們用瞭如何的技術我就不得而知了,我知道好像南極星之前以同屏顯示繁簡中文爲賣點。
後來,因爲各方面的緣由,國際上又制定了針對中文的統一字符集GBK和GB18030,當中GBK已經在Windows、Linux等多種操做系統中被實現。
GBK兼容GB2312,並添加了大量不常用漢字,還添加了差點兒所有的Big5中的繁體漢字。但是GBK中的繁體漢字和Big5中的差點兒不兼容。
GB18030至關因而GBK的超集,比GBK包含的字符不少其它。據我所知眼下尚未操做系統直接支持GB18030。
談談Unicode編碼,簡要解釋UCS、UTF、BMP、BOM等名詞
這是一篇程序猿寫給程序猿的趣味讀物。所謂趣味是指可以比較輕鬆地瞭解一些原來不清楚的概念,增進知識,類似於打RPG遊戲的升級。整理這篇文章的動機是兩個問題:
問題一:
使用Windows記事本的「另存爲」,可以在GBK、Unicode、Unicode big
endian和UTF-8這幾種編碼方式間相互轉換。一樣是txt文件,Windows是如何識別編碼方式的呢?
我很是早前就發現Unicode、Unicode big
endian和UTF-8編碼的txt文件的開頭會多出幾個字節,各自是FF、FE(Unicode),FE、FF(Unicode big
endian),EF、BB、BF(UTF-8)。但這些標記是基於什麼標準呢?
問題二:
近期在網上看到一個ConvertUTF.c,實現了UTF-3二、UTF-16和UTF-8這三種編碼方式的相互轉換。對於Unicode(UCS2)、GBK、UTF-8這些編碼方式,我原來就瞭解。但這個程序讓我有些糊塗,想不起來UTF-16和UCS2有什麼關係。
查了查相關資料,總算將這些問題弄清楚了,順帶也瞭解了一些Unicode的細節。寫成一篇文章,送給有過類似疑問的朋友。本文在寫做時儘可能作到通俗易懂,但要求讀者知道什麼是字節,什麼是十六進制。
0、big endian和little endian
big endian和little
endian是CPU處理多字節數的不一樣方式。好比「漢」字的Unicode編碼是6C49。那麼寫到文件中時,究竟是將6C寫在前面,仍是將49寫在前面?假設將6C寫在前面,就是big
endian。仍是將49寫在前面,就是little endian。
「endian」這個詞出自《格列佛遊記》。小人國的內戰就源於吃雞蛋時是到底從大頭(Big-Endian)敲開仍是從小頭(Little-Endian)敲開,由此曾發生過六次叛亂,當中一個皇帝送了命,還有一個丟了王位。
咱們通常將endian翻譯成「字節序」,將big endian和little
endian稱做「大尾」和「小尾」。
一、字符編碼、內碼,順帶介紹漢字編碼
字符必須編碼後才幹被計算機處理。計算機使用的缺省編碼方式就是計算機的內碼。早期的計算機使用7位的ASCII編碼,爲了處理漢字,程序猿設計了用於中文簡體的GB2312和用於繁體中文的big5。
GB2312(1980年)一共收錄了7445個字符,包含6763個漢字和682個其它符號。漢字區的內碼範圍高字節從B0-F7,低字節從A1-FE,佔用的碼位是72*94=6768。當中有5個空位是D7FA-D7FE。
GB2312支持的漢字太少。1995年的漢字擴展規範GBK1.0收錄了21886個符號,它分爲漢字區和圖形符號區。漢字區包含21003個字符。2000年的GB18030是代替GBK1.0的正式國家標準。該標準收錄了27484個漢字,同一時候還收錄了藏文、蒙文、維吾爾文等基本的少數民族文字。現在的PC平臺必須支持GB18030,對嵌入式產品暫不做要求。因此手機、MP3通常僅僅支持GB2312。
從ASCII、GB23十二、GBK到GB18030,這些編碼方法是向下兼容的,即同一個字符在這些方案中老是有一樣的編碼,後面的標準支持不少其它的字符。在這些編碼中,英文和中文可以統一地處理。區分中文編碼的方法是高字節的最高位不爲0。依照程序猿的稱呼,GB23十二、GBK到GB18030都屬於雙字節字符集
(DBCS)。
有的中文Windows的缺省內碼仍是GBK,可以經過GB18030升級包升級到GB18030。只是GB18030相對GBK添加的字符,普通人是很是難用到的,一般咱們仍是用GBK指代中文Windows內碼。
這裏還有一些細節:
GB2312的原文仍是區位碼,從區位碼到內碼,需要在高字節和低字節上分別加上A0。
在DBCS中,GB內碼的存儲格式始終是big endian,即高位在前。
GB2312的兩個字節的最高位都是1。但符合這個條件的碼位僅僅有128*128=16384個。因此GBK和GB18030的低字節最高位均可能不是1。只是這不影響DBCS字符流的解析:在讀取DBCS字符流時,僅僅要遇到高位爲1的字節,就可以將下兩個字節做爲一個雙字節編碼,而不用管低字節的高位是什麼。
二、Unicode、UCS和UTF
前面提到從ASCII、GB23十二、GBK到GB18030的編碼方法是向下兼容的。而Unicode僅僅與ASCII兼容(更準確地說,是與ISO-8859-1兼容),與GB碼不兼容。好比「漢」字的Unicode編碼是6C49,而GB碼是BABA。
Unicode也是一種字符編碼方法,只是它是由國際組織設計,可以容納全世界所有語言文字的編碼方案。Unicode的學名是"Universal
Multiple-Octet Coded Character Set",簡稱爲UCS。UCS可以看做是"Unicode
Character Set"的縮寫。
依據維基百科全書(http://zh.wikipedia.org/wiki/)的記載:歷史上存在兩個試圖獨立設計Unicode的組織,即國際標準化組織(ISO)和一個軟件製造商的協會(unicode.org)。ISO開發了ISO
10646項目,Unicode協會開發了Unicode項目。
在1991年先後,兩方都認識到世界不需要兩個不兼容的字符集。因而它們開始合併兩方的工做成果,併爲創立一個單一編碼表而協同工做。從Unicode2.0開始,Unicode項目採用了與ISO
10646-1一樣的字庫和字碼。
眼下兩個項目仍都存在,並獨立地發佈各自的標準。Unicode協會現在的最新版本號是2005年的Unicode
4.1.0。ISO的最新標準是10646-3:2003。
UCS規定了怎麼用多個字節表示各類文字。如何傳輸這些編碼,是由UTF(UCS
Transformation Format)規範規定的,常見的UTF規範包含UTF-八、UTF-七、UTF-16。
IETF的RFC2781和RFC3629以RFC的一向風格,清楚、明快又不失嚴謹地描寫敘述了UTF-16和UTF-8的編碼方法。我老是記不得IETF是Internet
Engineering Task
Force的縮寫。但IETF負責維護的RFC是Internet上一切規範的基礎。
三、UCS-二、UCS-四、BMP
UCS有兩種格式:UCS-2和UCS-4。顧名思義,UCS-2就是用兩個字節編碼,UCS-4就是用4個字節(實際上僅僅用了31位,最高位必須爲0)編碼。如下讓咱們作一些簡單的數學遊戲:
UCS-2有2^16=65536個碼位,UCS-4有2^31=2147483648個碼位。
UCS-4依據最高位爲0的最高字節分紅2^7=128個group。每個group再依據次高字節分爲256個plane。每個plane依據第3個字節分爲256行
(rows),每行包含256個cells。固然同一行的cells僅僅是最後一個字節不一樣,其他都一樣。
group 0的plane 0被稱做Basic Multilingual Plane,
即BMP。或者說UCS-4中,高兩個字節爲0的碼位被稱做BMP。
將UCS-4的BMP去掉前面的兩個零字節就獲得了UCS-2。在UCS-2的兩個字節前加上兩個零字節,就獲得了UCS-4的BMP。而眼下的UCS-4規範中尚未不論什麼字符被分配在BMP以外。
四、UTF編碼
UTF-8就是以8位爲單元對UCS進行編碼。從UCS-2到UTF-8的編碼方式例如如下:
UCS-2編碼(16進制) UTF-8 字節流(二進制)
0000 - 007F 0xxxxxxx
0080 - 07FF 110xxxxx 10xxxxxx
0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
好比「漢」字的Unicode編碼是6C49。6C49在0800-FFFF之間,因此確定要用3字節模板了:1110xxxx
10xxxxxx 10xxxxxx。將6C49寫成二進制是:0110 110001 001001,
用這個比特流依次代替模板中的x,獲得:11100110 10110001 10001001,即E6 B1 89。
讀者可以用記事本測試一下咱們的編碼是否正確。
UTF-16以16位爲單元對UCS進行編碼。對於小於0x10000的UCS碼,UTF-16編碼就等於UCS碼相應的16位無符號整數。對於不小於0x10000的UCS碼,定義了一個算法。只是因爲實際使用的UCS2,或者UCS4的BMP一定小於0x10000,因此就眼下而言,可以以爲UTF-16和UCS-2基本一樣。但UCS-2僅僅是一個編碼方案,UTF-16卻要用於實際的傳輸,因此就不得不考慮字節序的問題。
五、UTF的字節序和BOM
UTF-8以字節爲編碼單元,沒有字節序的問題。UTF-16以兩個字節爲編碼單元,在解釋一個UTF-16文本前,首先要弄清楚每個編碼單元的字節序。好比收到一個「奎」的Unicode編碼是594E,「乙」的Unicode編碼是4E59。假設咱們收到UTF-16字節流「594E」,那麼這是「奎」仍是「乙」?
Unicode規範中推薦的標記字節順序的方法是BOM。BOM不是「Bill Of
Material」的BOM表,而是Byte Order Mark。BOM是一個有點小聰明的想法:
在UCS編碼中有一個叫作"ZERO WIDTH NO-BREAK
SPACE"的字符,它的編碼是FEFF。而FFFE在UCS中是不存在的字符,因此不該該出現在實際傳輸中。UCS規範建議咱們在傳輸字節流前,先傳輸字符"ZERO
WIDTH NO-BREAK SPACE"。
這樣假設接收者收到FEFF,就代表這個字節流是Big-Endian的;假設收到FFFE,就代表這個字節流是Little-Endian的。所以字符"ZERO
WIDTH NO-BREAK SPACE"又被稱做BOM。
UTF-8不需要BOM來代表字節順序,但可以用BOM來代表編碼方式。字符"ZERO
WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB
BF(讀者可以用咱們前面介紹的編碼方法驗證一下)。因此假設接收者收到以EF BB
BF開頭的字節流,就知道這是UTF-8編碼了。
Windows就是使用BOM來標記文本文件的編碼方式的。
函數
系統支持
Windows 98 :僅僅支持ANSI。
Windows 2k :既支持ANSI又支持UNICODE。
Windows CE :僅僅支持UNICODE。
Windows 2000整個OS系統都是基於UNICODE的,爲此在windows 2000下使用ANSI是需要付出代價的,儘管在編碼上不用不論什麼的轉換,但是這樣的轉化是隱藏的,是佔用系統資源的(CPU,內存)。
在Windows 98下必須使用UNICODE,則需要本身手動的編碼切換。
字體
在計算機中字符一般並不是保存爲圖像,每個字符都是使用一個編碼來表示的,而每個字符到底使用哪一個編碼表明,要取決於使用哪一個字符集(charset)。
在最初的時候,Internet上僅僅有一種字符集——ANSI的ASCII字符集,它使用7 bits來表示一個字符,總共表示128個字符,當中包含了英文字母、數字、標點符號等常用字符。以後,又進行擴展,使用8 bits表示一個字符,可以表示256個字符,主要在原來的7 bits字符集的基礎上增長了一些特殊符號好比製表符。
後來,由於各國語言的增長,ASCII已經不能知足信息交流的需要,所以,爲了可以表示其餘國家的文字,各國在ASCII的基礎上制定了本身的字符集,這些從ANSI標準派生的字符集被習慣的統稱爲ANSI字符集,它們正式的名稱應該是MBCS(Multi-Byte Chactacter System,即多字節字符系統)。這些派生字符集的特色是以ASCII 127 bits爲基礎,兼容ASCII 127,他們使用大於128的編碼做爲一個Leading Byte,緊跟在Leading Byte後的第二(甚至第三)個字符與Leading Byte一塊兒做爲實際的編碼。這樣的字符集有很是多,咱們常見的GB-2312就是當中之中的一個。
好比在GB-2312字符集中,「連通」的編碼爲C1 AC CD A8,當中C1和CD就是Leading Byte。前127個編碼爲標準ASCII保留,好比「0」的編碼是30H(30H表示十六進制的30)。軟件在讀取時,假設看到30H,知道它小於128就是標準ASCII,表示「0」,看到C1大於128就知道它後面有一個另外的編碼,所以C1 AC一同構成一個整個的編碼,在GB-2312字符集中表示「連」。
由於每種語言都制定了本身的字符集,致使最後存在的各類字符集實在太多,在國際交流中要常常轉換字符集很是不便。所以,提出了Unicode字符集,它固定使用16 bits(兩個字節、一個字)來表示一個字符,共可以表示65536個字符。將世界上差點兒所有語言的常用字符收錄當中,方便了信息交流。標準的Unicode稱爲UTF-16。後來爲了雙字節的Unicode可以在現存的處理單字節的系統上正確傳輸,出現了UTF-8,使用類似MBCS的方式對Unicode進行編碼。注意UTF-8是編碼,它屬於Unicode字符集。Unicode字符集有多種編碼形式,而ASCII僅僅有一種,大多數MBCS(包含GB-2312)也僅僅有一種。
好比「連通」兩個字的Unicode標準編碼UTF-16 (big endian)爲:DE 8F 1A 90
而其UTF-8編碼爲:E8 BF 9E E9 80 9A
最後,當一個軟件打開一個文本時,它要作的第一件事是決定這個文本究竟是使用哪一種字符集的哪一種編碼保存的。軟件有三種途徑來決定文本的字符集和編碼:
最標準的途徑是檢測文本最開頭的幾個字節,例如如下表:
開頭字節 Charset/encoding
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.
好比插入標記後,連通」兩個字的UTF-16 (big endian)和UTF-8碼分別爲:
FF FE DE 8F 1A 90
EF BB BF E8 BF 9E E9 80 9A
但是MBCS文本沒有這些位於開頭的字符集標記,更不幸的是,一些早期的和一些設計不良的軟件在保存Unicode文本時不插入這些位於開頭的字符集標記。所以,軟件不能依賴於這樣的途徑。這時,軟件可以採取一種比較安全的方式來決定字符集及其編碼,那就是彈出一個對話框來請示用戶,好比將那個「連通」文件拖到MS Word中,Word就會彈出一個對話框。
假設軟件不想麻煩用戶,或者它不方便向用戶請示,那它僅僅能採取本身「猜」的方法,軟件可以依據整個文本的特徵來推測它可能屬於哪一個charset,這就很是可能不許了。使用記事本打開那個「連通」文件就屬於這樣的狀況。
咱們可以證實這一點:在記事本中鍵入「連通」後,選擇「Save As」,會看到最後一個下拉框中顯示有「ANSI」,這時保存。當再當打開「連通」文件出現亂碼後,再點擊「File」->「Save As」,會看到最後一個下拉框中顯示有「UTF-8」,這說明記事本以爲當前打開的這個文本是一個UTF-8編碼的文本。而咱們剛纔保存時是用ANSI字符集保存的。這說明,記事本推測了「連通」文件的字符集,以爲它更像一個UTF-8編碼文本。這是由於「連通」兩個字的GB-2312編碼看起來更像UTF-8編碼致使的,這是一個巧合,不是所有文字都這樣。可以使用記事本的打開功能,在打開「連通」文件時在最後一個下拉框中選擇ANSI,就能正常顯示了。反過來,假設以前保存時保存爲UTF-8編碼,則直接打開也不會出現故障。
假設將「連通」文件放入MS Word中,Word也會以爲它是一個UTF-8編碼的文件,但它不能肯定,所以會彈出一個對話框詢問用戶,這時選擇「中文簡體(GB2312)」,就能正常打開了。記事本在這一點上作得比較簡化罷了,這與這個程序的定位是一致的。
編碼