文件編碼詳解 徹底解決中文亂碼問題

摘要:本文作者通過對常用文本編碼iso8859-1、GDK/GB2312、ANSI、unicode 以及UTF的原理介紹,非常詳細地概括了文件編碼實現的意義,從而幫助我們徹底解決中文亂碼的頭痛問題。很不錯的一篇博文,原文標題《理清文件編碼,告別中文亂碼》,一起來看看。

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

iso8859-1

iso8859-1 通常叫做Latin-1,屬於單字節編碼,最多能表示的字符範圍是0-255,應用於英文系列。比如,字母a的編碼爲0×61=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 都是變長表示的,歐美程序員會覺得太浪費,因爲歐美字符 0×0000 – 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


原文來自:博客園

發佈了42 篇原創文章 · 獲贊 6 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章