久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

字符集與編碼[下]

 網(wǎng)文收集 2012-04-22

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

 

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

 

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

 

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

 

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

 

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

 

        USC-2用2個字節(jié)保存字符,,其包含了西歐和亞洲絕大多數(shù)國家的字符,常用unicode采用USC-2,。USC-4用4個字節(jié)保存字符,,這種基本上很少用到,因為太浪費資源,。

 

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

 

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

 

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

 

        OK,,總結(jié)一下吧,,ascii,、gb2312、gbk,、big5,、unicode都稱為字符集,而UTF-8,、UTF-16叫做編碼方式(其實 gb2312也有其編碼方式,,此文暫不討論)。一般情況下,,盡量使用UTF-8編碼方式,,因為它即通用又能很好的節(jié)約空間。

 

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

文本內(nèi)容 文本格式 占用空間大小
a ascii 1字節(jié)
a unicode 4字節(jié) (FFFE + a字母)
a unicode big endian 4字節(jié) (FEFF + a字母)
a utf-8 1字節(jié)
a utf-8+ 4字節(jié) (EFBBBF + a字母)
ascii 2字節(jié)
unicode 4字節(jié)
unicode big endian 4字節(jié)
utf-8 3字節(jié)
utf-8+ 6字節(jié)
 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,,謹防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多