1. 程式人生 > >Unicode編碼完全探究(三)之聯通亂碼

Unicode編碼完全探究(三)之聯通亂碼

一、文章來由

這個亂碼問題很早以前就發現了,其實就是編碼的問題導致~~~

二、現象

新建一個文字文件,輸入“聯通”二字(不帶引號),然後儲存、關閉,再重新開啟。你發現了什麼?沒錯,“聯通”二字已經變成了亂碼“��ͨ”,那麼為什麼會產生這種情況呢?這就要涉及到字元編碼的問題了。

這裡寫圖片描述

三、原因

  在計算機技術剛出現的時候,只有ASCII這一種字符集,但是隨著技術的發展,ASCII明顯不夠用了,因為ASCII碼一共只規定了128個字元的編碼,英語是夠用了,但是其他語言不行,於是就又產生了其他的編碼標準,比如簡體中文的是GB2312編碼。但是由於每種語言都制定了自己的字符集,導致最後存在的各種字符集實在太多,在國際交流中要經常轉換字符集非常不便。因此,提出了Unicode字符集,它固定使用16 bits(兩個位元組、一個字)來表示一個字元,共可以表示65536個字元。標準的Unicode稱為UTF-16。後來為了雙位元組的Unicode能夠在現存的處理單位元組的系統上正確傳輸,出現了UTF-8。注意UTF-8是編碼,它屬於Unicode字符集。Unicode字符集有多種編碼形式,而ASCII只有一種。
  
  有人開玩笑說出現這個BUG的原因是中國聯通把微軟得罪了,這當然是玩笑話了,其實出現上述亂碼問題的關鍵在於字符集。記事本儲存的時候,預設使用ANSI編碼,比如“聯通二字的ASNI編碼為:FF FE 6A 00 68 03 ,UTF-8編碼為:FF FE 54 80 1A 90。可以看到ASNI編碼和UTF-8編碼的前面都是“FF FE”,於是問題就產生了。當你在記事本中輸入“聯通”二字並且儲存後,它預設是以ASNI編碼儲存的。但是開啟文件時使用的則是UTF-8編碼,於是就產生了亂碼。這是因為記事本不能判斷你儲存時的編碼標準,而且它也不會問你使用了哪種標準,於是就靠“猜測”來判斷你的編碼標準,因為聯通二字的ANSI編碼正好是以“FF FE”開頭的,這樣以ANSI編碼儲存以後再次開啟,記事本首先檢測到“FF FE”,就認為是UTF-8編碼了,於是按照UTF-8編碼開啟以後就會顯示為亂碼。於是不可避免就可能產生錯誤,像“聯通”二字這樣的情況,還有別的,比如“透支”二字。
  
  假設儲存文件時選擇另存為,編碼格式選擇UTF-8,那麼你再開啟那個文字文件時就不會發生亂碼了。

這裡寫圖片描述