天天看點

理清檔案編碼,告别中文亂碼

理清檔案編碼,告别中文亂碼

理清檔案編碼,告别中文亂碼

在工作中少不了碰到檔案亂碼的問題,面對這麼多的中文漢字編碼,真不知該選哪個好,不如徹底搞清楚,讓亂碼灰飛煙滅;以下介紹文本編碼中常用到的幾種:iso8859-1、GDK/GB2312、ANSI、unicode 以及UTF ;

iso8859-1

iso8859-1 通常叫做Latin-1,屬于單位元組編碼,最多能表示的字元範圍是0-255,應用于英文系列。比如,字母a的編碼為0x61=97。 很明顯,iso8859-1編碼表示的字元範圍很窄,無法表示中文字元。但是,由于是單位元組編碼,和計算機最基礎的表示機關一緻,是以很多時候,仍舊使用iso8859-1編碼來表示。而且在很多協定上,預設使用該編碼。比如,雖然"中文"兩個字不存在iso8859-1編碼,以gb2312編碼為例,應該是"d6d0 cec4"兩個字元,使用iso8859-1編碼的時候則将它拆開為4個位元組來表示:"d6 d0 ce c4"(事實上,在進行存儲的時候,也是以位元組為機關處理的)。

GDK/GB2312

GB2312是漢字的國标碼,是簡體中文的字元集編碼;專門用來表示漢字,是雙位元組編碼,而英文字母和iso8859-1一緻(相容iso8859-1編碼)。

蘋果OS以GB2312為基本漢字編碼;

GBK 是 GB2312的擴充,除了相容GB2312外,它還能顯示繁體中文,還有日文的假名;

Windows 95/98以GBK為基本漢字編碼、但相容支援GB2312。

ANSI

不同的國家和地區制定了不同的标準,由此産生了 GB2312, BIG5, JIS 等各自的編碼标準。這些使用 2 個位元組來代表一個字元的各種漢字延伸編碼方式,稱為 ANSI 編碼。在簡體中文作業系統下,ANSI 編碼代表 GB2312 編碼,在日文作業系統下,ANSI 編碼代表 JIS 編碼。(BIG5:台灣标準)

不同 ANSI 編碼之間互不相容,當資訊在國際間交流時,無法将屬于兩種語言的文字,存儲在同一段 ANSI 編碼的文本中。

ANSI編碼表示英文字元時用一個位元組,表示中文用兩個位元組,而unicode不管表示英文字元還是中文都是用兩個位元組來表示。

unicode

Unicode(統一碼、萬國碼、單一碼、标準萬國碼)是業界的一種标準,它可以使電腦得以呈現世界上數十種文字的系統。

大概來說,Unicode 編碼系統可分為編碼方式和實作方式兩個層次。

Unicode 的編碼方式與 ISO 10646 的通用字元集(Universal Character Set,UCS)概念相對應,目前實際應用的 Unicode 版本對應于 UCS-2,使用16位的編碼空間。也就是每個字元占用2個位元組。這樣理論上一共最多可以表示 2 即 65536 個字元。基本滿足各種語言的使用。實際上目前版本的 Unicode 尚未填充滿這16位編碼,保留了大量空間作為特殊使用或将來擴充。

Unicode 的實作方式不同于編碼方式。一個字元的 Unicode 編碼是确定的。但是在實際傳輸過程中,由于不同系統平台的設計不一定一緻,以及出于節省空間的目的,對 Unicode 編碼的實作方式有所不同。Unicode 的實作方式稱為Unicode轉換格式(Unicode Translation Format,簡稱為 UTF)。

目前通用的實作方式是 UTF-16小尾序(BOM)、UTF-16大尾序(BOM)和 UTF-8。在微軟公司Windows XP作業系統附帶的記事本中,“另存為”對話框可以選擇的四種編碼方式除去非 Unicode 編碼的 ANSI 外,其餘三種“Unicode”、“Unicode big endian”和“UTF-8”即分别對應這三種實作方式。

注:通常我們看到的編碼選項中,和UTF-8放在一塊的“Unicode編碼”指的是UTF-16 小端編碼;

UTF-8

UTF-8是UNICODE的一種變長字元編碼,由Ken Thompson于1992年建立。

UTF-8, 8bit編碼, ASCII不作變換, 其他字元做變長編碼, 每個字元1-3 byte(英文字母用一個位元組,漢字使用3個位元組),有以下優點:

  • 與CPU位元組順序無關, 可以在不同平台之間交流
  • 容錯能力高, 任何一個位元組損壞後, 最多隻會導緻一個編碼碼位損失, 不會鍊鎖錯誤(如GB碼錯一個位元組就會整行亂碼)

    UTF-16, 16bit編碼, 是變長碼, 大緻相當于20位編碼, 值在0到0x10FFFF之間, 基本上就是unicode編碼的實作. 它是變長碼, 與CPU字序有關, 但因為最省空間, 常作為網絡傳輸的外碼.

UTF-8與UTF-16的差別

UTF8 和 UTF16 都是變長表示的,歐美程式員會覺得太浪費,因為歐美字元 0x0000 - 0x00FF 就搞定了,UTF8 最小變長是 1 個位元組,而 UTF16 變長是 2 個位元組,

utf-8 與 uft-16 表示 'a' a的ascii是0X61

utf-8為[0X61]

uft-16 [0x00,0X61]

注意,雖然說utf-8是為了使用更少的空間而使用的,但那隻是相對于utf-16編碼來說,如果已經知道是漢字,則使用GB2312/GBK無疑是最節省的。

檢視檔案編碼

windows系統下将檔案用記事本打開,然後檔案--另存為 在對話框最下面的編碼那一欄就有檔案對應的編碼。

source insight中的中文編碼問題

代碼開發經常用到source insight,這個軟體的注釋是支援ANSI的代碼編寫、但是如果是UTF-8的中文(在Linux下預設的生成檔案,編碼都是UTF-8編碼的),在source insight下顯示的就是亂碼檔案;

解決的方法詳見附錄參考文章;

附錄:參考連結

1.關于編碼ansi、GB2312、unicode與utf-8的差別

http://blog.csdn.net/chruan/article/details/8812110

2.source insight中文注釋亂碼問題的解決方案

http://blog.csdn.net/ccf19881030/article/details/8987759

3.Source Insight完美轉換UTF-8 到 GB2312

http://blog.csdn.net/e0sys1/article/details/4670188

4.UNICODE wiki

http://www.baike.com/wiki/Unicode

Posted by: 大CC | 31JUL,2014

部落格:blog.me115.com [訂閱]

微網誌:新浪微網誌