字元編碼簡明教程

2021-07-27 07:46:03 字數 4432 閱讀 3211

** 

之前寫了個,極其詳盡的,關於字元編碼的教程:

字元編碼詳解

由於內容太多,所以,新手學習起來,相對比較耗時和繁瑣。

此處,為了更方便的,快速學習和了解,我們,尤其是中國人,相對常見的那些字元編碼:

gb2312,gbk,gb18030

以及其他在程式設計實踐中比較容易遇到的:

ascii,utf-8,unicode,iso8859-1

以及,其他一些,也需要稍微了解一下的

正體中文的big5

等編碼,以及這些編碼之間的邏輯關係。

所以,特此專門,去寫個,相對篇幅不長的,容易理解和看懂的,關於字元編碼的簡明教程。

換句話說:

如果只是想要了解常見的字元編碼,則看看此文,就差不多了;

如果想要了解詳細的,關於每個字元編碼的編碼邏輯等細節內容,還是需要去看:字元編碼詳解

此文的目的,只是為了第一點:讓不熟悉字元編碼的人,看了此文,對於各種字元編碼,有個基本的了解。

計算機中,目前用的最廣泛,也是最基本的,算是ascii字元編碼了。

對於ascii的簡單總結就是:

ascii就是我們最常見的,26個英文本母,加上常見的那些字元等等,加起來的,字元編碼。

而對於這些字元,很容易理解,也在其他字元編碼中出現,比如簡體中文本元,正體中文本元,西歐字元,unicode等等,

所以,可以理解為:

ascii,就是其他各種字元編碼,所共有的最小集合,是其他字元編碼的始祖。

對於ascii的具體所含內容,可以總結為:

ascii字符集共27

個字元

=128個字元

= 33個控制字元 + 95個可見字元

=33個控制字元 + (26個英文本母 + 常見的符號)

=null,…,cr,lf,vt,ff,…space,delete + (abc…xyzabc…xyz + !」#$…\^_…)

簡體中文的發展歷史,以此是:

2023年,國標指定的gb2312-80,簡稱gb2312,對應著微軟最早的cp936

微軟對於gb2312做了擴充套件,利用gb2312未使用的編碼空間,加進去gb13000和unicode1.1的字元,制定了gbk,對應著,微軟的現在的cp936

2023年,中國,額外又收錄了藏文、蒙文、維吾爾文等主要的少數民族文字,出了國標gb18030-2000,簡稱gb18030,對應著微軟的cp54936

對於這幾個字符集的關係是:

從編碼的相容性上:

gb2312,gbk,gb18030,是相容的,包含的字元個數,以此更多,可以寫成:

gb2312 < gbk < gb18030

從包含的字元個數上:

gb13000和gbk基本上是一樣的(但是編碼不相容)

中文編碼和微軟的**頁的關係是:

gb2312==舊的cp936

gbk==新的cp936

gb18030==cp54936

此處,簡單說說,據我所知的,中文字元編碼,在實際使用中的情況:

網頁中的編碼,一般是通過charset指定的;

很多中文網頁,charset用的gb2312;

但是部分網頁,所宣告的編碼和實際編碼不同:

雖然charset指定的是gb2312,但是實際上用的是(包含了更多字元的)gbk;

導致的情況是:

如果你按照gb2312去解碼,由於部分字元是屬於gbk的,而非gb2312,則會出現解碼失敗

解決辦法是:

嘗試用gbk,或包含更多字元的gb18030去解碼,則一般都可以正常解碼的。

【整理】關於html網頁原始碼的字元編碼(charset)格式(gb2312,gbk,utf-8,iso8859-1等)的解釋

上面的gb2312,gbk,gb18030,都是針對於中國大陸的,簡體中文;

對於台灣等地區,都是用的是正體中文,其和我們的編碼不同;

正體中文一般都是用的是big5,中文一般稱為大五碼,其對應者微軟的cp950;

歐洲包含很多國家和地區,按照地域,大概可分為,西歐,中歐,南歐,北歐,等等;

此處,在字元編碼上,為了實現歐洲,如此多種的地區和語系,支援其所用的字元,然後發展處乙個國際標準,叫做iso/iec 8859,簡稱iso8859

iso8859,其下分了很多分支,從1到15,分別叫做iso8859-1,iso8859-2,……,iso8859-15

可以說:iso8859,包含了整個歐洲所用的各種字元;

其中,最最常用的,就是:iso8859-1,又常被稱為latin-1,表示的就是西歐字元;

此處,簡單說說,我之前所了解到的,iso8859-1的使用情況。

很多網頁編碼,尤其是和西歐相關的,比如德文或者西歐某國家的類似的其他的網頁,很多都是用的是iso8859-1

1. 注意,實際上,iso 8859和iso-8859,不是同乙個東西,是有點細微差別的,詳見:

2.2.2.5. iso 8859和iso-8859的區別和聯絡

2.另外:

a.2. iso/iec 8859編碼標準中的15種字符集

字元編碼發展到最後,要考慮的問題是:

最好用,單獨的,某個字元編碼,可以囊括世界上所有的字元,包括以後可能出現的字元

此種編碼,就是後來的unicode。

unicode,版本上,主要有之前的unicode 1.1和最新的unicode 2.0;

unicode編碼目前有兩種,ucs-2和ucs-4;

目前最常用的是ucs-2,即用2個位元組=2個byte=16個bit=16位,來表示字元。

理論上,最多可以表示2^16=65536個=6萬多個字元,足夠支援目前世界上所有的字元了。

需要了解的是:

unicode,只是乙個字符集的概念,即表示,設計了一套邏輯,可以用不同的值,表示不同的字元,這個是unicode標準做的事情,即支援了所有的字元;

但是,要把unicode,在計算機中實現出來,表示出來,以及把unicode字元,從從乙個地方傳送到別的地方,即字元交換,方面,則涉及到,實際上所採用的字元編碼;

把字符集unicode表示出來的字元編碼,有多種,最常見的有,utf-8和utf-16,次常見的還有utf-32。

即:unicode是字符集的概念,utf-8,utf-16是字元編碼的概念;

utf-8,utf-16等,只是unicode的實現方式之一。

明白了unicode和utf-8的關係後,再來說說,utf-8這個字元編碼的邏輯:

utf-8是一種變長的編碼方式,可以使用1~4個位元組表示乙個符號,根據不同的符號而變化位元組長度。

utf-8的編碼規則很簡單,只有二條:

下表總結了編碼規則,字母x表示可用編碼的位。

unicode與utf-8之間的編碼對映關係

unicode符號範圍(十六進製制)

utf-8編碼方式(二進位制)

0000 0000-0000 007f

0******x

0000 0080-0000 07ff

110***xx 10******

0000 0800-0000 ffff

1110***x 10****** 10******

0001 0000-0010 ffff

11110*** 10****** 10****** 10******

舉例:以漢字「嚴」為例,演示如何實現utf-8編碼:

「嚴」的unicode是4e25,介於00008000到0000fff之間,根據上表,「嚴」的utf-8編碼格式是「1110***x 10****** 10******」。

然後,從「嚴」的最後乙個二進位制位開始,依次從後向前填入格式中的x,多出的位補0。

這樣就得到了,「嚴」的utf-8編碼是 「11100100 10111000 10100101」,轉換成十六進製制就是e4b8a5。

注意:utf-8,是標準的寫法,其他也有別人寫成utf8的,但是很多程式,是不識別此種非標準寫法的。

以後,最好還是用utf-8,這個名字。

下面,就用乙個圖表,來解釋,各種常見字元編碼之間的邏輯關係:

對於此圖,再簡單解釋一下:

簡體中文的編碼

正體中文的編碼

西歐字元編碼

統一了世界上所有字元的unicode

此處,簡單總結一下,關於各種編碼的使用方面的情況:

西歐等字元和網頁,多數使用iso8859-1

正體中文,一般用big5

字元編碼簡明教程

之前寫了個,極其詳盡的,關於字元編碼的教程 字元編碼詳解 由於內容太多,所以,新手學習起來,相對比較耗時和繁瑣。此處,為了更方便的,快速學習和了解,我們,尤其是中國人,相對常見的那些字元編碼 gb2312,gbk,gb18030 以及其他在程式設計實踐中比較容易遇到的 ascii,utf 8,uni...

字元編碼簡明教程

字元編碼簡明教程之前寫了個,極其詳盡的,關於字元編碼的教程 字元編碼詳解 由於內容太多,所以,新手學習起來,相對比較耗時和繁瑣。此處,為了更方便的,快速學習和了解,我們,尤其是中國人,相對常見的那些字元編碼 gb2312,gbk,gb18030 以及其他在程式設計實踐中比較容易遇到的 ascii,u...

Visual Unit 簡明教程

visual unit,簡稱vu,是新一代單元測試工具,功能強大,使用簡單,完全視覺化,不需編寫測試 vu的測試結果使程式行為一目了然,有助於整理程式設計思路,提高程式設計效率和正確性,並能快速排錯 vu還增強偵錯程式功能 如自由後退 用例切換 提高除錯的效率 vu能達到空前的測試完整性,輕鬆完成語...