關於字符及編碼

首先,我們要知道一些概念和標準。
    字符和字節是兩個容易混淆的概念,下面我們來看一下它們的含義。
•    字符:人們用來表示某種意義的符號,如“1”、“a”、“字”等。
•    字節:字節是存儲空間的基本計量單位,由8個二進制位構成。
•    字符串:零個或多個字符組成的有限序列。
•    字符集:字符的集合,由於歷史原因形成了多種標準,主要包括以下幾種:
  ASCII字符集
  ANSI字符集
  Unicode字符集
    這些字符集包含什麼又有什麼關係呢?
    這個問題的答案就是計算機字符集的發展歷史。
    ASCII(美國信息交換標準委員會American Standards Committee for Information Interchange)字符集,是計算機產生之初爲英文通信設計的7位字符集。包含了基本的英文字母、數字、標點符號等128個字符。
    隨着計算機的廣泛應用,爲了可以在計算機中保存更多的信息,增加了新的字母、符號,還加入了很多畫表格時需要用到的橫線、豎線、交叉等形狀。這些新增的字符從用128到255之間的數字進行表示,它們構成的字符集通常被稱爲“擴展字符集”。
    計算機進入中國後爲了表示漢字(僅常用漢字就有6000多個),我們規定:一個小於127的字符的意義與原來相同,但兩個大於127的字符連在一起時,就表示一個漢字,前面的一個字節(稱爲高字節)從0xA1用到0xF7,後面一個字節(稱爲低字節)從0xA1到0xFE,這樣就可以組合出7445個簡體漢字。在這些編碼裏,還把數學符號、羅馬希臘的字母、日文的假名都編進去了,連在ASCII裏本來就有的數字、標點、字母都統統重新編成了兩個字節長的編碼,這就是常說的“全角”字符,而原來在127號以下的那些就叫“半角”字符了。這種漢字方案叫做“GB2312”,是對ASCII的中文擴展。
    由於漢字太多,我們不得不再一次增加字符的使用範圍,只要第一個字節大於127就固定表示這是一個漢字的開始,不管後面跟的是不是擴展字符集裏的內容。擴展之後的編碼方案被稱爲GBK標準,GBK包括了GB2312的所有內容,同時又增加了近20000個新的漢字(包括繁體字)和符號。後來我們再擴展,又加了幾千個新的少數民族的字,GBK擴成了GB18030。
    程序員們將其通稱爲“DBCS”(雙字節字符集Double Byte Charecter Set),最大的特點是兩字節長的漢字字符和一字節長的英文字符並存,因此中文處理時必須要注意字串裏每一個字節的值,如果這個值是大於127的,就可以將下兩個字節作爲一個雙字節編碼,而不用管低字節的高位是什麼。
與此同時各個國家和地區所制定的不同ANSI編碼標準中,都只規定了各自語言所需的“字符”。這些ANSI編碼標準所規定的內容包含兩層含義:
  標準中包含哪些文字和符號,而這些“字符”的集合稱爲“字符集”。
  規定每個“字符”分別用幾個字節存儲。用什麼值來表示這些字符,這個規定就叫做“編碼”。
    因爲當時各個國家都搞出一套自己的編碼標準,結果互相之間誰也不懂誰的編碼,誰也不支持別人的編碼,連中國大陸和中國臺灣使用着同一種語言的地區,也分別採用了不同的DBCS編碼方案——GB2313(中國大陸)和BIG5(中國臺灣)編碼,裝錯了字符系統,顯示就會亂了套。
    這時,ISO的國際組織決定着手解決這個問題。他們重新搞了一個包括地球上所有文字和符號的編碼——“Universal Multiple-Octet Coded Character Set”,簡稱UCS,就是我們現在常說的“Unicode”。
Unicode在制定時沒有考慮與任何一種現有的編碼方案保持兼容,這使得GBK與Unicode在漢字的內碼編排上是完全不一樣的,沒有一種簡單的算法可以使文本內容在Unicode編碼和ANSI編碼間進行轉換,這種轉換必須通過查表來進行。
    Unicode開始制定時,計算機的存儲器容量極大地發展了,空間再也不成爲問題了。於是ISO就直接規定必須用兩個字節,也就是16位來統一表示所有的字符,對於ASCII裏的那些字符,Unicode保持其原編碼不變,只是將其長度由原來的8位擴展爲16位,而其他語言的文字和符號則全部重新統一編碼。由於英文符號只需要用到低8位,所以其高8位永遠是0,因此這種方案在保存英文文本時會浪費一倍的空間。
    從Unicode開始,無論是半角的英文字母,還是全角的漢字,都是統一的“一個字符”。同時,也都是統一的“兩個字節”(這裏要注意“字符”和“字節” 兩個概念的不同,“字節”是物理存儲的基本計量單位,而“字符”則是一個文化相關的符號)。在Unicode中,一個字符就是兩個字節。
    多種字符集存在時,那些生產多語言軟件的公司爲了在不同的國家銷售同一套軟件,就不得不在區域化軟件時注意雙字節字符集,不僅要處處小心不要搞錯,還要把軟件中的文字在不同的字符集中轉來轉去。Unicode對於他們來說是一個很好的一攬子解決方案,於是從Windows NT開始,微軟把它們的操作系統改了一遍,把所有的核心代碼都改成了用Unicode方式工作的版本,從這時開始,Windows系統終於無須加裝各種本土語言系統,就可以顯示全世界上所有文化的字符了。
    如前所述,Unicode是用兩個字節來表示一個字符,總共可以組合出65535個不同的字符,這大概已經可以覆蓋世界上所有文化的符號。如果還不夠也沒有關係,ISO已經準備了UCS-4方案,就是四個字節來表示一個字符,這樣就可以組合出21億個不同的字符(最高位規定爲0)。
    爲了解決Unicode的傳輸問題,產生了面向傳輸的UTF(通用字集轉換格式——Universal Character Set Transformation Format)標準,顧名思義,UTF-8就是以8位爲單元對UCS進行編碼,UTF-16以16位爲單元對UCS進行編碼,Unicode與UTF之間可以通過一些算法和規則來相互轉換。

 

 

聞香止步 淘寶 拍拍 有啊 易趣店 收集於:http://blog.csdn.net/broadview2006/archive/2009/06/02/4234795.aspx

常年經營木雕系列產品:海南黃花梨、越南黃花梨、草花梨、小葉紫檀、黑檀、綠檀木、黃楊木、桃木髮簪  木梳 樟木壁掛 佛珠 車飾 擺件
收藏送禮佳品,也可訂做
http://shop36570193.taobao.com

朋友,有空來看看,喜歡的朋友請收藏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章