編碼字符集:表示某種編碼所涉及到字元的集合。例如ascii字符集、gb2312字符集。僅表示集合,集合元素(即字元)按照某種順序排放,並編上序號。如unicode。
字元編碼:把字符集中的字元編碼為二進位制,用來表示字符集中的字元,是字符集的實現方式。如utf-8,utf-16,utf-32就是unicode的實現。
發展關係: ascii -> eascii -> iso 8859
最初的ascii只有七位(用於36位計算機),由ansi協會於2023年公布首版標準。只能支援基礎拉丁字元。
記得ansi c標準嗎?就是這個協會發布的。注:我們現在通常說到ansi編碼,通常指的是平台的預設編碼,例如英文作業系統中是iso-8859-1,中文系統是gbk。
來自:wikipedia:eventually, as 8-, 16- and 32-bit (and later 64-bit) computers began to replace 18- and 36-bit computers as the norm, it became common to use an 8-bit byte to store each character in memory, providing an opportunity for extended, 8-bit, relatives of ascii.而隨著8位、16位、32位開始替代18位和36位計算機,此時ascii可以從7位擴充套件到8位,擴充套件後的ascii稱為eascii。eascii相容ascii,在其前面擴充套件一位。它解決了部份西歐語言的顯示問題。此外還擴充了符號,包括製表符、計算符號、希臘字母和特殊的拉丁符號。
來自:雖然它解決了西歐字元的編碼問題,但是對於歐洲其他地方卻沒有辦法。於是出現了iso 8859。iso 8859是單位元組編碼,相容ascii。主要用於歐洲。
它本身不是乙個標準,而是一系列標準,由15個字符集所組成。表示為iso 8850-n (n = 1,2,3 ...11,13...16,沒有12)。
iso 8859-1 有個別名:latin-1,是西歐常用字元,包括德法兩國的字母。其00000000(0×00)-01111111(0x7f)範圍段與ascii保持一致,而10000000(0×80)-11111111(0xff)範圍段被擴充套件用到不同的字符集。
又簡稱為gb 2312或gb 2312-80。1980為該字符集發布年份。gb為國標(國家標準)拼音首字母。
gb 2312將ascii裡本來就有的數字、標點、字母都統統重新編了兩個位元組長的編碼,這就是常說的」全形」字元,而原來在127號以下的那些就叫」半形」字元。
gbk中英文都用兩個位元組來表示,相容gb2312,加入對繁體字的支援。k為擴充套件的kuo首字母。
windows用cp936來實現對gbk字符集的編譯碼。因此有些地方charset=windows-936就是指gbk。
gb 2312的**頁為:cp20936gbk的取代版本,在gbk基礎上增加了cjk統一漢字擴充區a的漢字。cjk:china japan korea,中日韓在gb 18030-2000的基礎上加上了cjk統一漢字擴充區b的漢字,以及少數民族的文字。gb 18030與gb 2312-1980完全相容,與gbk基本相容,支援gb 13000及unicode的全部統一漢字,共收錄漢字70244個。
與gb2312有衝突。繁體字符集。big->大寫。
big5是使用正體中文(正體中文)社群中最常用的電腦漢字字符集標準,共收錄13,060個漢字。big5雖普及於台灣、香港與澳門等正體中文通行區,但長期以來並非當地的國家標準,而只是業界標準。
2023年,big5被收錄到cns11643中文標準交換碼的附錄當中,取得了較正式的地位。這個最新版本被稱為big5-2003。
儘管人們能夠在一台計算機上查閱不同語言的文件,但是乙份文件無法同時使用多種編碼。特別是在網路上,各個國家互相訪問的時候,會出現亂碼。unicode就是用來解決這個問題的。
unicode基於通用字符集(universal character set)的標準來發展,它幾乎涵蓋了各個國家語言可能出現的符號和文字,並為它們編號。
unicode中文範圍 4e00-9fbf:cjk 統一表意符號。unicode就是一開始提到的編碼字符集,而utf-8、utf-16、utf-32就是字元編碼,即unicode規則字型檔的實現形式。unicode使用4位元組的數字來表達每個字母、符號,或者表意文字。但是這樣有乙個問題:如果直接採用4位元組的編碼,那麼就會浪費大量空間。例如,乙個儲存器本來可以儲存800份以ascii編碼的文件,現在用unicode編碼,只能儲存200份,這樣大量的儲存空間就被浪費了。
utf-8巧妙地解決了這個問題。
utf-8使用可變長的編碼,例如 ascii 部分仍然使用乙個位元組,中文用兩個位元組……。也因為如此,它沒有實現所有的 unicode 的字元,它只實現了unicode的plane 0(unicode共有16個plane。plane 0又稱為bmp,basic multilingual plane)。
是不是感覺跟 ip 位址的 a, b, c, d 類的劃分很像?這種分類方式應該可以推廣到很多地方去。
utf-8與中文:
utf-8 的缺陷是無法表示 plane 0 外的字元。而utf-16可以應對這種情況。
ucs = universal character set
utf-16由ucs-2發展而來。ucs-2最初設計的時候只考慮到bmp(plane 0)字元,因此使用固定2個位元組長度,也就是說,它無法表示unicode其他層面上的字元,而utf-16為了解除這個限制,支援unicode全字符集的編譯碼,採用了變長編碼,最少使用2個位元組,如果要編碼bmp以外的字元,則需要4個位元組結對。
utf-8和utf-16的變長是不一樣的。utf-8以乙個位元組為單位,擴充套件時,可以1-> 2-> 3位元組;而utf-16以兩個位元組為單位,擴充套件時只能2-> 4位元組。將ucs-4的bmp去掉前面的兩個零位元組就得到了ucs-2。在ucs-2的兩個位元組前加上兩個零位元組,就得到了ucs-4的bmp。而目前的ucs-4規範中還沒有任何字元被分配在bmp之外。本來utf-32是ucs-4的乙個子集。但現在它們幾乎完全一樣,不過utf-32新增了額外的unicode語義(可以編碼更多的unicode字元)。
bom的全稱是byte order mark,bom是微軟給utf-8編碼加上的,用於標識檔案使用的是utf-8編碼,即在utf-8編碼的檔案起始位置,加入三個位元組「ef bb bf」。
這是微軟特有的,windows 的記事本(即新建文字文件,txt)就是用utf-8 with bom。utf-8標準並不推薦包含bom的方式。採用加bom的utf-8編碼檔案,對於一些只支援標準utf-8編碼的環境,可能導致問題。比如,網頁第一行可能會顯示乙個「?」,明明正確的程式一編譯就報語法錯誤,等等。
既然有如上缺點,為什麼還要用bom呢?因為計算機系統分為大端模式和小端模式。
如果同一篇文件,在大端模式下編寫,傳到小端模式的機器上,就會讀取錯誤。然而只要在文件的開始,告訴計算機所要讀取的文件是在大端模式還是小端模式上寫的,就不怕讀取順序出錯了。
中文字符集編碼unicode ,gb2312 , cp936 ,gbk,gb18030 -
ascii - wikipedia
utf-16 - wikipedia
utf-32 - wikipedia
byte order mark - wikipedia
程式設計師趣味讀物:談談unicode編碼
unicode、gb2312、gbk和gb18030中的漢字
and so on……
字元編碼總結
各種編碼的檔案頭 ff fe unicode fe ff unicode big endian ef bb bf utf 8 unicode也是一種字元編碼方法,不過它是由國際組織設計,可以容納全世界所有語言文字的編碼方案。unicode的學名是 universal multiple octet c...
字元編碼總結
ascii 0 127 gb2312 0xa1a1 f7fe兩個位元組,是對ascii的補充,同時也把ascii中的字元編進 去,成全角字元。gbk 是對gb2312的一種補充,收錄的漢字範圍更大。gb2312標準共收錄6763個 漢字,其中一級漢字3755個,二級漢字3008個 gbk共收入218...
字元編碼問題總結
字元編碼或者字符集由編碼組成,使得某一字串行匹配於一指定集合中某一東西,例如可能顯示為一種自然數序列,交流所用的字母表或者字音表 到乙個給定的集合中的其它東西,如乙個自然數序列 8位位元組或者電脈衝,以便於文字在計算機中的儲存和通過通訊網路的傳送。常見的例子包括將拉丁字母表編碼成一些列長短發報電鍵的...