Category Archives: programming

[轉貼] Unicode、UTF-8 和 ISO-8859-1 到底有什麼區別

來源:http://campuss.blog.sohu.com/74210127.html Unicode、UTF-8 和 ISO-8859-1到底有什麼區別 本文主要包括以下幾個方面:編碼基本知識,java,系統軟件,url,工具軟件等。 在下面的描述中,將以”中文”兩個字爲例,經查表可以知道其GB2312編碼是”d6d0 cec4″,Unicode編碼爲”4e2d 6587″,UTF編碼就是”e4b8ad e69687″。注意,這兩個字沒有ISO-8859-1編碼,但可以用ISO-8859-1編碼來”表示”。 2. 編碼基本知識 最早的編碼是ISO-8859-1,和ASCII編碼相似。但爲了方便表示各種各樣的語言,逐漸出現了很多標準編碼,重要的有如下幾個。 2.1. ISO-8859-1 屬於單字節編碼,最多能表示的字符範圍是0-255,應用於英文系列。比如,字母a的編碼爲0x61=97。 很明顯,ISO-8859-1編碼表示的字符範圍很窄,無法表示中文字符。但是,由於是單字節編碼,和計算機最基礎的表示單位一致,所以很多時候,仍舊使用ISO-8859-1編碼來表示。而且在很多協議上,默認使用該編碼。比如,雖然”中文”兩個字不存在ISO-8859-1編碼,以gb2312編碼爲例,應該是”d6d0 cec4″兩個字符,使用ISO-8859-1編碼的時候則將它拆開爲4個字節來表示:”d6 d0 ce c4″(事實上,在進行存儲的時候,也是以字節爲單位處理的)。而如果是UTF編碼,則是6個字節”e4 b8 ad e6 96 87″。很明顯,這種表示方法還需要以另一種編碼爲基礎。 2.2. GB2312/GBK 這就是漢子的國標碼,專門用來表示漢字,是雙字節編碼,而英文字母和ISO-8859-1一致(兼容ISO-8859-1編碼)。其中gbk編碼能夠用來同時表示繁體字和簡體字,而gb2312只能表示簡體字,gbk是兼容gb2312編碼的。 2.3. unicode 這是最統一的編碼,可以用來表示所有語言的字符,而且是定長雙字節(也有四字節的)編碼,包括英文字母在內。所以可以說它是不兼容ISO-8859-1編碼的,也不兼容任何編碼。不過,相對於ISO-8859-1編碼來說,uniocode編碼只是在前面增加了一個0字節,比如字母a爲”00 61″。 需要說明的是,定長編碼便於計算機處理(注意GB2312/GBK不是定長編碼),而unicode又可以用來表示所有字符,所以在很多軟件內部是使用unicode編碼來處理的,比如java。 2.4. UTF 考慮到unicode編碼不兼容ISO-8859-1編碼,而且容易佔用更多的空間:因爲對於英文字母,unicode也需要兩個字節來表示。所以unicode不便於傳輸和存儲。因此而產生了utf編碼,utf編碼兼容ISO-8859-1編碼,同時也可以用來表示所有語言的字符,不過,utf編碼是不定長編碼,每一個字符的長度從1-6個字節不等。另外,utf編碼自帶簡單的校驗功能。一般來講,英文字母都是用一個字節表示,而漢字使用三個字節。 注意,雖然說utf是爲了使用更少的空間而使用的,但那只是相對於unicode編碼來說,如果已經知道是漢字,則使用GB2312/GBK無疑是最節省的。不過另一方面,值得說明的是,雖然utf編碼對漢字使用3個字節,但即使對於漢字網頁,utf編碼也會比unicode編碼節省,因爲網頁中包含了很多的英文字符。 3. java對字符的處理 在java應用軟件中,會有多處涉及到字符集編碼,有些地方需要進行正確的設置,有些地方需要進行一定程度的處理。 3.1. getBytes(charset) 這是java字符串處理的一個標準函數,其作用是將字符串所表示的字符按照charset編碼,並以字節方式表示。注意字符串在java內存中總是按unicode編碼存儲的。比如”中文”,正常情況下(即沒有錯誤的時候)存儲爲”4e2d 6587″,如果charset爲”gbk”,則被編碼爲”d6d0 cec4″,然後返回字節”d6 d0 ce c4″。如果charset爲”utf8″則最後是”e4 b8 ad e6 96 87″。如果是”ISO-8859-1″,則由於無法編碼,最後返回 “3f 3f”(兩個問號)。… Read More »