1. 程式人生 > 其它 >例項探究字元編碼:unicode,utf-8,default,gb2312 的區別

例項探究字元編碼:unicode,utf-8,default,gb2312 的區別

 最近做郵件收發,不同的郵件系統間可能會出現編碼問題,迫使我重新回來研究一下字元的編碼問題,unicode,utf-8,gb2312這些編碼格式都是我們熟知的,default 編碼格式是哪一種呢?我們用例項來看看:

string str = "china,中華人民共和國";
            byte[] bufferutf8 = system.text.encoding.utf8.getbytes(str);
            printbyte("utf8:", bufferutf8);

            byte[] bufferunicode = system.text.encoding.unicode.getbytes(str);
            printbyte("unicode:", bufferunicode);

            byte[] bufferdefault = system.text.encoding.default.getbytes(str);
            printbyte("default:", bufferdefault);

            byte[] buffergb2312 = system.text.encoding.getencoding ("gb2312").getbytes(str);
            printbyte("gb2312:", buffergb2312);

    下面是輸出結果:

utf8:   string length:27,code: 

67 104 105 110 97 44 228 184 173 229 141 142 228 186 186 230 176 145 229 133 177 229 146 140 229 155 189 

unicode:string length:26,code: 

67 0 104 0 105 0 110 0 97 0 44 0 45 78 78 83 186 78 17 108 113 81 140 84 253 86 

default:string length:20,code: 

67 104 105 110 97 44 214 208 187 170 200 203 195 241 185 178 186 205 185 250 

gb2312: string length:20,code: 

67 104 105 110 97 44 214 208 187 170 200 203 195 241 185 178 186 205 185 250 

大家看到了,在這個例項中,uft-8格式編碼所佔位元組是最長的,gb2312最短,unicode稍次。再仔細看看utf-8對於"china,"這6個字元的編碼:

67 104 105 110 97 44 

gb2312 和 default 編碼結果也是這樣;

而unicode的編碼是:

67 0 104 0 105 0 110 0 97 0 44 0

unicode 編碼在英文字元後都補充了一個0,所以unicode是典型的雙位元組編碼,它不區分是英文還是中文,統統用兩個位元組表示一個字元。

所以,utf-8,gb2312等編碼都是“變長編碼”的,但是對於中文的編碼處理上,gb2312所需的位元組更少。

而default 編碼,則取決於當前系統編碼,比如我們的作業系統安裝的時候預設選擇的都是“簡體中文”(gb2312),所以測試中也證實了當前的環境編碼格式

gb2312=default

    因此,我們在使用國外開源的程式碼的時候,一定要注意編碼的問題,如果他們處理字元的時候使用的是ascii,我們使用肯定會出問題,如果使用的是 default,也要當心,他們理解的default是ascii,在對程式後續處理上可能不是我們期望的,也可能會出問題。

    最近的郵件收發我使用了國外的開源專案 openpop 和 opensmtp ,就曾經遇到了編碼問題,希望大家以後使用國外的開原始碼對字元編碼問題一定要引起注意。

那麼我們究竟應該選擇何種編碼?這取決於實際情況,參看http://faq.csdn.net/read/210325.html (關於unicode和utf8,utf16等)

這篇文章,建議說:

使用utf-8編碼,可以使unicode編碼的大多數為英文字元(<0x7f)的字串佔用的空間最少,但是使雙位元組的unicode字元(比如中文)表示來需要三個位元組,比起純粹的雙位元組表示的unicode字串來說,各有利弊吧

有關編碼的具體定義和關係,請看:

http://zhidao.baidu.com/question/2692826.html (utf8和unicode編碼究竟是什麼關係?有何區別?)

utf8和unicode編碼究竟是什麼關係?有何區別?