日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

字符集与编码[下]

發(fā)布時(shí)間:2024/4/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 字符集与编码[下] 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ??????寫程序的人基本上都會(huì)遇到亂碼的問題,之前自己對(duì)字符集、編碼等問題也是一知半解,大概明白什么意思,但卻說不清楚。由于公司需要做多語言,于是研究了一下,終于把字符集和編碼等問題弄明白了。

?

????????ascii、GB2312、GBK、unicode、utf-8、utf-16、ucs2、ucs4......,對(duì)于很多人來說這些東西都是比較模糊的(以前的我也是),字符集編碼問題不理解透徹,很難說清楚他們之間的關(guān)系。下面就從頭開始把這些概念整理一下,希望對(duì)大家有幫助,自己也總結(jié)一下。

?

????????計(jì)算機(jī)只認(rèn)識(shí)0和1,因此世界上的任何符號(hào)在計(jì)算機(jī)中都必須轉(zhuǎn)換成0和1來表示,所謂字符集就是一個(gè)字符對(duì)應(yīng)到數(shù)字編碼的對(duì)應(yīng)表。于是最先有了ascii 碼,它是用一個(gè)字節(jié)(8位)來表示字符。ascii的第一個(gè)bit永遠(yuǎn)是0,因此ascii碼最多能表示128個(gè)字符(2的7次方)。英語大小寫字母共 52個(gè)字母,加上數(shù)字和一些控制符號(hào)(如回車、tab等),128也夠用了。

?

????????但隨著計(jì)算機(jī)的普及,除了英語以外的其他語言(如中文)使用ascii碼就不行了。于是每個(gè)國家都為自己的語言定義了一套字符集,以中文為例,有了 gb2312、big5等字符集。gb2312中收錄了7000多個(gè)常用的簡體中文字符,而big5為臺(tái)灣用的繁體中文。gb2312和big5等字符集都是用兩個(gè)字節(jié)來保存的,因?yàn)橐粋€(gè)字節(jié)只能表示128個(gè)字符。新的字符集出來,程序問題也相應(yīng)的出來了,以前的程序處理字符都是1個(gè)1個(gè)字節(jié)的處理字符,而新的字符集要求兩個(gè)兩個(gè)的處理字符,那我們的程序到底是該一個(gè)一個(gè)字節(jié)讀取還是兩個(gè)兩個(gè)字節(jié)的讀取呢?很快人們發(fā)現(xiàn)ascii碼都是以0開頭,那么新的字符集都用1開頭問題就解決了。程序讀到以0開頭的字節(jié)就一個(gè)字節(jié)一個(gè)字節(jié)的讀字符,遇到1開頭的字節(jié)就兩個(gè)兩個(gè)字節(jié)的開始讀。因此gb2312、 big5等字符集和ascii是兼容的。

?

????????gb2312只收錄了7000多個(gè)字符,并沒有收錄所有的中文字符,因此在1995年和2000年,我國先后推出了gbk1.0和gb18030。 gb18030收錄了所有的中文字符,包括少數(shù)民族的文字。到此我們有了一個(gè)中文字符集的發(fā)展線路:ascii -> gb2312 -> gbk1.0 -> gb18030 他們是由小到大的,并且是向下兼容的。到此中文的問題解決了,似乎一切都OK了。

?

????????但世界上如此多的國家,每個(gè)國家都有一套自己的字符集,這樣太亂了,于是老大哥ISO開始推出統(tǒng)一全世界字符的字符集了——unicode(也稱 UCS)。unicode占用4個(gè)字節(jié),總共可以收錄2147483648個(gè)字符,這足以涵蓋地球上所有用到的字符了。但一個(gè)字符4個(gè)字節(jié)相當(dāng)?shù)睦速M(fèi)資源,特別是在網(wǎng)絡(luò)傳輸時(shí)。于是unicode推出了2個(gè)標(biāo)準(zhǔn),分別是UCS-2和UCS-4。

?

????????USC-2用2個(gè)字節(jié)保存字符,其包含了西歐和亞洲絕大多數(shù)國家的字符,常用unicode采用USC-2。USC-4用4個(gè)字節(jié)保存字符,這種基本上很少用到,因?yàn)樘速M(fèi)資源。

?

????????UTF-8、UTF-16是unicode的編碼格式,這里需要搞清楚字符集和編碼格式的區(qū)別。字符集是一個(gè)字符和數(shù)字的對(duì)應(yīng)表,表示每一個(gè)字符對(duì)應(yīng)的數(shù)字,而編碼是指這些字符對(duì)應(yīng)的數(shù)字在計(jì)算機(jī)中如何保存。比如,字符“中”對(duì)應(yīng)的unicode碼為4E2D,但在計(jì)算機(jī)中保存時(shí)不一定就是4E2D。(注意,此處寫的是不一定)

?

????????先說簡單的UTF-16,UTF-16用固定兩個(gè)字節(jié)對(duì)unicode進(jìn)行編碼,因此UTF-16編碼就等于unicode碼。例如,字符“中”對(duì)應(yīng) UTF-16編碼為4E2D。這中間又必須考慮字節(jié)序的問題,因?yàn)椴煌钠脚_(tái)對(duì)于字節(jié)序的處理方式不一樣,有的是高位在前低位在后,而有的正好相反。因此,字符“中”的UTF-16有兩種編碼方式,分別是4E2D和2D4E。那程序如何知道是哪種呢?于是有了BOM(?Bill Of Material),簡單點(diǎn)說就是在文件最前面加一個(gè)標(biāo)記(占2個(gè)字節(jié),其實(shí)也是一個(gè)unicode字符)來表示高位在前還是低位在前。如果文件最前面是FEFF則表示高位在前,又叫Big-Endian,如果是FFFE則表示低位在前,又叫Little-Endian。

?

????????UTF-8比較麻煩一點(diǎn),他是編碼是變長的,也就是說不是使用固定的兩個(gè)字節(jié)來進(jìn)行編碼。對(duì)于0-127的字符采用0XXXXXXX的形式保存(1個(gè)字節(jié)),128-2047采用110XXXXX 10XXXXXX的形式保存(兩個(gè)字節(jié)),2048-65535采用1110XXXX 10XXXXXX 10XXXXXX(三個(gè)字節(jié))的形式保存。舉例來說,字符“中”對(duì)應(yīng)的unicode碼為4E2D(0100111000101101)也就是 20013,在2048-65535之間,因此“中”的UTF-8編碼為11100100?10?111000?10?101101。對(duì)于UTF-8編碼來說,程序讀到0開頭的字節(jié)表示只需要讀一個(gè)字節(jié),遇到110開頭的表示需要讀取兩個(gè)字節(jié),而讀到1110開頭的表示要讀取三個(gè)字節(jié)。因此對(duì)于有大量英文字符的文檔而言,使用UTF-8編碼可以節(jié)約大量磁盤空間。UTF-8是不需要BOM的,因?yàn)樗菃蝹€(gè)字節(jié)處理的,但也可以為UTF-8文件加上BOM。為UTF-8加上BOM后,在文件頭會(huì)多出3個(gè)字節(jié),為?EF BB BF,它就是FEFF對(duì)應(yīng)的UTF-8編碼。

?

????????OK,總結(jié)一下吧,ascii、gb2312、gbk、big5、unicode都稱為字符集,而UTF-8、UTF-16叫做編碼方式(其實(shí) gb2312也有其編碼方式,此文暫不討論)。一般情況下,盡量使用UTF-8編碼方式,因?yàn)樗赐ㄓ糜帜芎芎玫墓?jié)約空間。

?

????????我們可以做一些實(shí)驗(yàn)檢驗(yàn)一下上文所述內(nèi)容,下面是我檢驗(yàn)的結(jié)果,大家可以對(duì)照一下:

文本內(nèi)容文本格式占用空間大小
aascii1字節(jié)
aunicode4字節(jié) (FFFE + a字母)
aunicode big endian4字節(jié) (FEFF + a字母)
autf-81字節(jié)
autf-8+4字節(jié) (EFBBBF + a字母)
ascii2字節(jié)
unicode4字節(jié)
unicode big endian4字節(jié)
utf-83字節(jié)
utf-8+6字節(jié)
?



本文轉(zhuǎn)自鋼鋼博客園博客,原文鏈接:http://www.cnblogs.com/xugang/archive/2010/05/08/1730451.html,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者

總結(jié)

以上是生活随笔為你收集整理的字符集与编码[下]的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。