編碼 1常見的字元編碼基礎

2021-10-10 21:17:32 字數 2915 閱讀 5283

ascll

正常來說乙個位元組佔乙個乙個位元組,但乙個位元組八個二進位制位元只能代表2^8=256個字元

ascll碼代表的字元一共128,即7個二進位制位, 由於計算機基本處理單位是位元組, 所以ascll增加了乙個奇偶校驗碼,此為iso646標準

在iso646的相容下, iso2022標準將 ascii 字符集擴充為 8 位**的統一方法。 iso 陸續制定了一批適用於不同地區的擴充 ascii 字符集,每種擴充 ascii 字符集分別可以擴充 128 個字元,這些擴充字元的編碼均為高位為 1 的 8 位**(即十進位制數 128~255 ),稱為擴充套件 ascii 碼。

mbcs

使用 2 個位元組來代表乙個字元的各種漢字延伸編碼方式,稱為 ansi 編碼,又稱為"mbcs(muilti-bytes character set,多位元組字符集)"。在簡體中文系統下,ansi 編碼代表 gb2312 編碼,在日文作業系統下,ansi 編碼代表 jis 編碼。 不同 ansi 編碼之間互不相容,當資訊在國際間交流時,無法將屬於兩種語言的文字,儲存在同一段 ansi 編碼的文字中。乙個很大的缺點是,同乙個編碼值,在不同的編碼體系裡代表著不同的字。這樣就容易造成混亂。導致了unicode碼的誕生。

其中每個語言下的ansi編碼,都有一套一對一的編碼轉換器,unicode變成所有編碼轉換的中間介質。所有的編碼都有乙個轉換器可以轉換到unicode,而unicode也可以轉換到其他所有的編碼。

gb2312

ansi編碼裡的一種,對ansi編碼最初始的ascii編碼進行擴充,為了滿足國內在計算機中使用漢字的需要,中國國家標準總局發布了一系列的漢字字符集國家標準編碼,統稱為gb碼,或國標碼。

gb2312分94區, 每個區94列, 區碼和位碼分別佔乙個儲存單元

為避免同西文的儲存發生衝突,gb2312字元在進行儲存時,通過將原來的每個位元組第8bit設定為1同西文加以區別,如果第8bit為0,則表示西文字元,否則表示gb2312中的字元。

實際儲存時,採用了將區位碼的每個位元組分別加上a0h(160)的方法轉換為儲存碼,計算機儲存規則是此編碼的補碼,而且是位碼在前,區碼在後。例如漢字『啊』的區位碼為1601,其儲存碼為b0a1h,其轉換過程為:

區位碼區碼轉換

位碼轉換

儲存碼1001h

10h+a0h=b0h

01h+a0h=a1h

b0a1h

由於國外瀏覽器不支援gb2312編碼, 所以用這個編碼編寫的網頁可能在國外瀏覽器不了, 相應地, 我們也有可能難以正常瀏覽國外(如日本)的網頁.

gbk

gbk即漢字內碼擴充套件規範,k為擴充套件的漢語拼音中「擴」字的聲母。gbk編碼標準相容gb2312,共收錄漢字21003個、符號883個,並提供1894個造字碼位,簡、繁體字融於一庫。gbk能解決gb2312不能編碼古漢文等罕用字的問題.

gbk採用雙位元組表示,總體編碼範圍為8140-fefe,首位元組在81-fe 之間,尾位元組在40-fe 之間,剔除 xx7f一條線。總計23940 個碼位,共收入21886個漢字和圖形符號,其中漢字(包括部首和構件)21003 個,圖形符號883 個。

另外, 當前面是0x00-0x7f時, 則是gbk乙個位元組的編碼方式, 與ascll保持一致

也就是說, 前面不包含80和ff

unicode

如果有一種編碼,將世界上所有的符號都納入其中,無論是英文、日文、還是中文等,大家都使用這個編碼表,就不會出現編碼不匹配現象。每個符號對應乙個唯一的編碼,亂碼問題就不存在了。這就是unicode編碼。

utf-8

為了提高unicode的編碼效率,於是就出現了utf-8編碼。utf-8可以根據不同的符號自動選擇編碼的長短。比如英文本母可以只用1個位元組就夠了。

utf-8的編碼是這樣得出來的,以」漢」這個字為例:

「漢」字的unicode編碼是u+00006c49,然後把u+00006c49通過utf-8編碼器進行編碼,最後輸出的utf-8編碼是e6b189。

base64

有的電子郵件系統(比如國外信箱)不支援非英文本母(比如漢字)傳輸,

這是歷史原因造成的(認為只有美國會使用電子郵件?)。因為乙個英文本母使用ascii編碼來儲存,佔儲存器的1個位元組(8位),實際上只用了7位2進製來儲存,第一位並沒有使用,設定為0,所以,這樣的系統認為凡是第一位是1的位元組都是錯誤的。而有的編碼方案(比如gb2312)不但使用多個位元組編碼乙個字元,並且第一位經常是1,於是郵件系統就把1換成0,這樣收到郵件的人就會發現郵件亂碼。

為了能讓郵件系統正常的收發信件,就需要把由其他編碼儲存的符號轉換成ascii碼來傳輸。比如,在一端傳送gb2312編碼->根據base64規則->轉換成ascii碼,接收端收到ascii碼->根據base64規則->還原到gb2312編碼。。

base64編碼會把3位元組的二進位制資料編碼為4位元組的文字資料,長度增加33%,好處是編碼後的文字資料可以在郵件正文、網頁等直接顯示。

如果要編碼的二進位制資料不是3的倍數,最後會剩下1個或2個位元組怎麼辦?base64用\x00位元組在末尾補足後,再在編碼的末尾加上1個或2個=號,表示補了多少位元組,解碼的時候,會自動去掉。

:廖雪峰的**:

中文編碼 1 常見中文編碼格式

為什麼要有中文編碼格式?最早的ascii碼只包括了字母 標點符號 特殊字元等127個字元。這些字元對於拉丁語系國家的人使用是足夠的,但是對於非拉丁語系國家 如中國 日本等 ascii碼就遠遠不夠了。因此就需要編碼來表示大量的漢字字元。常用的幾種中文編碼格式 1 unicode編碼 unicode編碼...

常見字元編碼

在程式中如果沒有處理好,就有可能出現亂碼問題。下面我們一起為大家介紹在開發中常見的編碼有哪些。在計算機世界裡,任何的文字都是以指定的編碼方式存在的。常見的編碼 iso8856 1 gbk gb2312 unicode utf。iso8856 1 屬於單位元組編碼,最多只能表示0 255的字元範圍,主...

python 基礎 字元編碼

編碼基礎 由於每個國家都有自己的字元,所以其對應關係也涵蓋了自己國家的字元,但是以上編碼都存在侷限性,即 僅涵蓋本國字元,無其他國家字元的對應關係。應運而生出現了萬國碼,他涵蓋了全球所有的文字和二進位制的對應關係。unicode 2 4位元組 已經收錄136690個字元,並還在一直不斷擴張中.uni...