之前寫了個,極其詳盡的,關於字元編碼的教程:
字元編碼詳解
由於內容太多,所以,新手學習起來,相對比較耗時和繁瑣。
此處,為了更方便的,快速學習和了解,我們,尤其是中國人,相對常見的那些字元編碼:
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;
2023年,國標,借鑑unicode 1.1,再收錄中國大陸、台灣、日本及南韓通用字符集的漢字,指定出國標:gb 13000.1-93,簡稱gb13000;
微軟對於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,u...
字元編碼簡明教程
之前寫了個,極其詳盡的,關於字元編碼的教程 字元編碼詳解 由於內容太多,所以,新手學習起來,相對比較耗時和繁瑣。此處,為了更方便的,快速學習和了解,我們,尤其是中國人,相對常見的那些字元編碼 gb2312,gbk,gb18030 以及其他在程式設計實踐中比較容易遇到的 ascii,utf 8,uni...
Visual Unit 簡明教程
visual unit,簡稱vu,是新一代單元測試工具,功能強大,使用簡單,完全視覺化,不需編寫測試 vu的測試結果使程式行為一目了然,有助於整理程式設計思路,提高程式設計效率和正確性,並能快速排錯 vu還增強偵錯程式功能 如自由後退 用例切換 提高除錯的效率 vu能達到空前的測試完整性,輕鬆完成語...