字元編碼 unicode編碼

2021-07-26 16:55:08 字數 3127 閱讀 4222

1. ascii(american standard code for information interchange)

美國資訊交換標準**,這是計算機上最早使用的通用的編碼方案。那個時候計算機還只是拉丁文本的專利,根本沒有想到現在計算機的發展勢頭,如果想到了,可能一開始就會使用unicode了。當時絕大部分專家都認為,要用計算機,必須熟練掌握英文。這種編碼占用7個bit,在計算機中占用乙個位元組,8位,最高位沒用,通訊的時候有時用作奇偶校驗位。因此ascii編碼的取值範圍實際上是:0x00-0x7f,只能表示128個字元。後來發現128個不太夠用,做了擴充套件,叫做ascii擴充套件編碼,用足八位,取值範圍變成:0x00-0xff,能表示256個字元。其實這種擴充套件意義不大,因為256個字元表示一些非拉丁文本遠遠不夠,但是表示拉丁文本,又用不完。所以擴充套件的意義還是為了下面的ansi編碼服務。

2. ansi(american national standard institite )

美國國家標準協會,也就是說,每個國家(非拉丁語系國家)自己制定自己的文字的編碼規則,並得到了ansi認可,符合ansi的標準,全世界在表示對應國家文字的時候都通用這種編碼就叫ansi編碼。換句話說,中國的ansi編碼和在日本的ansi的意思是不一樣的,因為都代表自己國家的文字編碼標準。比如中國的ansi對應就是gb2312標準,日本就是jit標準,香港,台灣對應的是big5標準等等。當然這個問題也比較複雜,微軟從95開始,用就是自己搞的乙個標準gbk。gb2312裡面只有6763個漢字,682個符號,所以確實有時候不是很夠用。gbk一直能和gb2312相互混淆並且相安無事的乙個重要原因是gbk全面相容gb2312,所以沒有出現任何衝突,你用gb2312編碼的檔案通過gbk去解釋一定能獲得相同的顯示效果,換句話說:gbk對gb2312就是,你有的,我也有,你沒得的,我還有!

好了,ansi的標準是什麼呢,首先是ascii的**你不能用!也就是說ascii碼在任何ansi中應該都是相同的。其他的,你們自己擴充套件。所以呢,中國人就把ascii碼變成8位,0x7f之前我不動你的,我從0xa0開始編,0xa0到0xff才95個碼位,對於中國字那簡直是杯水車薪,因此,就用兩個位元組吧,因此編碼範圍就從0xa1a1 - 0xfefe,這個範圍可以表示23901個漢字。基本夠用了吧,gb2312才7000多個呢!gbk更猛,編碼範圍是從0x8140 - 0xfefe,可以表示3萬多個漢字。可以看出,這兩種方案,都能保證漢字頭乙個位元組在0x7f以上,從而和ascii不會發生衝突。能夠實現英文和漢字同時顯示。

big5,香港和台灣用的比較多,繁體,範圍: 0xa140 - 0xf9fe, 0xa1a1 - 0xf9fe,每個字由兩個位元組組成,其第一位元組編碼範圍為0xa1~0xf9,第二位元組編碼範圍為0x40-0x7e與0xa1-0xfe,總計收入13868個字 (包括5401個常用字、7652 個次常用字、7個擴充字、以及808個各式符號)。

那麼到底ansi是多少位呢?這個不一定!比如在gb2312和gbk,big5中,是兩位!但是其他標準或者其他語言如果不夠用,就完全可能不止兩位!

例如:gb18030:gb18030-2000(gbk2k)在gbk的基礎上進一步擴充套件了漢字,增加了藏、蒙等少數民族的字形。gbk2k從根本上解決了字位不夠,字形不足的問題。它有幾個特點:它並沒有確定所有的字形,只是規定了編碼範圍,留待以後擴充。編碼是變長的,其二位元組部分與gbk相容;四位元組部分是擴充的字形、字位,其編碼範圍是首位元組0x81-0xfe、二位元組0x30-0x39、三位元組0x81-0xfe、四位元組0x30-0x39。它的推廣是分階段的,首先要求實現的是能夠完全對映到unicode3.0標準的所有字形。它是國家標準,是強制性的。

搞懂了ansi的含義,我們發現ansi有個致命的缺陷,就是每個標準是各自為陣的,不保證能相容。換句話說,要同時顯示中文和日本文或者阿拉伯文,就完全可能會出現乙個編碼兩個字符集裡面都有對應,不知道該顯示哪乙個的問題,也就是編碼重疊的問題。顯然這樣的方案不好,所以unicode才會出現!

3.mbcs(multi-byte chactacter system(set))

多位元組字元系統或者字符集,基於ansi編碼的原理上,對乙個字元的表示實際上無法確定他需要占用幾個位元組的,只能從編碼本身來區分和解釋。因此計算機在儲存的時候,就是採用多位元組儲存的形式。也就是你需要幾個位元組我給你放幾個位元組,比如a我給你放乙個位元組,比如"中「,我就給你放兩個位元組,這樣的字元表示形式就是mbcs。在基於gbk的windows中,不會超過2個位元組,所以windows這種表示形式有叫做dbcs(double-byte chactacter system),其實算是mbcs的乙個特例。c語言預設存放字串就是用的mbcs格式。從原理上來說,這樣是非常經濟的一種方式。

4.codepage

**頁,最早來自ibm,後來被微軟,oracle ,sap等廣泛採用。因為ansi編碼每個國家都不統一,不相容,可能導致衝突,所以乙個系統在處理文字的時候,必須要告訴計算機你的ansi是哪個國家和地區的標準,這種國家和標準的代號(其實就是字元編碼格式的代號),微軟稱為codepage**頁,其實這個**頁和字符集編碼的意思是一樣的。告訴你**頁,本質就是告訴了你編碼格式。但是不同廠家的**頁可能是完全不同,哪怕是同樣的編碼,比如, utf-8字元編碼 在ibm對應的**頁是1208,在微軟對應的是65001,在德國的sap公司對應的是 4110 。所以啊,其實本來就是乙個東西,大家各自為政,搞那麼多新名詞,實在沒必要!所以標準還是很重要的!!!

比如gbk的在微軟的**頁是936,告訴你**頁是936其實和告訴你我編碼格式是gbk效果完全相同。那麼處理文字的時候就不會有問題,不會去考慮某個**是顯示的韓文還是中文,同樣,日文和韓文的**頁就和中文不同,這樣就可以避免編碼衝突導致計算機不知如何處理的問題。當然用這個也可以很容易的切換語言版本。但是這都是治標不治本的方法,還是無法解決同時顯示多種語言的問題,所以最後還是都用unicode吧,永遠不會有衝突了。

5.unicode(universal code)

這是乙個編碼方案,說白了就是一張包含全世界所有文字的乙個編碼表,不管你用的上,用不上,不管是現在用的,還是以前用過的,只要這個世界上存在的文字元號,統統給你乙個唯一的編碼,這樣就不可能有任何衝突了。不管你要同時顯示任何文字,都沒有問題。

因此在這樣的方案下,unicode出現了。unicode編碼範圍是:0-0x10ffff,可以容納1114112個字元,100多萬啊。全世界的字元根本用不完了,unicode 5.0版本中,才用了238605個碼位。所以足夠了。因此從碼位範圍看,嚴格的unicode需要3個位元組來儲存。但是考慮到理解性和計算機處理的方便性,理論上還是用4個位元組來描述。

Unicode字元編碼

ascii碼 最早的字元編碼,使用乙個byte的7位來表示128種字元 控制字元,控制符,小寫字母,大寫字母,數字,標點,運算子等 然而對於英語國家來說,基本夠用 但對於使用非英文本元的國家來說,就不夠用了。擴充套件ascii碼 為了滿足需要,各國在相容ascii碼的基礎上對128 155等位元組進...

多字元編碼 和 Unicode編碼

四字符集和字元編碼說明 五 其他 c 基本資料型別中表示字元有兩種 char wchar t char 叫多位元組字元,乙個char佔乙個位元組,之所以叫多位元組字元是因為它表示乙個字時可能是乙個位元組也可能是多個位元組。乙個英文本元 如 s 用乙個char 乙個位元組 表示,乙個中文漢字 如 中 ...

unicode字元編碼區間表

因為我也沒有找到更適合的參考資料,因此只能自己生成乙份編碼表,然後從中找出這些特徵,不過大部份來說都是準確的,有些個別的外語,我也不知道是什麼。文 it柏拉圖 至於這個表是幹嗎的,如果你想對使用者輸入的一些東西進行過濾或嘗試識別亂碼,或編碼具於utf 8編碼的分詞系統,那麼這些參考資料是很有意義的。...