關於字元及編碼

2022-04-10 18:57:53 字數 2694 閱讀 2522

關於字元及編碼

首先,我們要知道一些概念和標準。

字元和位元組是兩個容易混淆的概念,下面我們來看一下它們的含義。

•    字元:人們用來表示某種意義的符號,如「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之間 可以通過一些演算法和規則來相互轉換。

關於字元編碼

美國人首先對其英文本元進行了編碼,也就是最早的ascii碼,用乙個位元組的低7位來表示英文的128個字元,高1位統一為0 後來歐洲人發現尼瑪你這128位哪夠用,比如我高貴的法國人字母上面的還有注音符,這個怎麼區分,得,把高1位編進來吧,這樣歐洲普遍使用乙個全位元組進行編碼,最多可表示256位。歐美人...

關於字元編碼

我們知道在學習php和jsp的時候,出現亂碼是經常性的事情,怎樣來一勞永逸的解決這個問題,我來做個總結。首先來了解一下字符集,我們關心的字符集大概有這麼幾個,iso 8859 1 gb2312 gbk utf 8,其中iso 8859 1是採用1個位元組進行編碼,而gb2312和gbk則是在其基礎之...

關於iOS字元編碼

剛遇到乙個字元編碼的問題,折騰了一天.檔案是用gb13080編碼的,android下面解析完全沒問題,但是ios下使用以下 nsdata data nsdata datawithcontentsoffile url nsstring s nsstring alloc initwithdata dat...