轉(zhuǎn)自 https://blog.csdn.net/kindsuper_liu/article/details/80202150
英文字母和中文漢字在不同字符集編碼下的字節(jié)數(shù)
英文字母:
·字節(jié)數(shù) : 1;編碼:GB2312
字節(jié)數(shù) : 1;編碼:GBK
字節(jié)數(shù) : 1;編碼:GB18030
字節(jié)數(shù) : 1;編碼:ISO-8859-1
字節(jié)數(shù) : 1;編碼:UTF-8
字節(jié)數(shù) : 4;編碼:UTF-16
字節(jié)數(shù) : 2;編碼:UTF-16BE
字節(jié)數(shù) : 2;編碼:UTF-16LE
中文漢字:
字節(jié)數(shù) : 2;編碼:GB2312
字節(jié)數(shù) : 2;編碼:GBK
字節(jié)數(shù) : 2;編碼:GB18030
字節(jié)數(shù) : 1;編碼:ISO-8859-1
字節(jié)數(shù) : 3;編碼:UTF-8
字節(jié)數(shù) : 4;編碼:UTF-16
字節(jié)數(shù) : 2;編碼:UTF-16BE
字節(jié)數(shù) : 2;編碼:UTF-16LE
美國(guó)人首先對(duì)其英文字符進(jìn)行了編碼,也就是最早的ascii碼仰猖,用一個(gè)字節(jié)的低7位來表示英文的128個(gè)字符,高1位統(tǒng)一為0奈籽;
后來歐洲人發(fā)現(xiàn)你這128位哪夠用饥侵,比如法國(guó)人字母上面的還有注音符,這個(gè)怎么區(qū)分衣屏,于是把高1位編進(jìn)來吧躏升,這樣歐洲普遍使用一個(gè)全字節(jié)進(jìn)行編碼,最多可表示256位狼忱。
但是即使位數(shù)少膨疏,不同國(guó)家地區(qū)用不同的字符編碼,雖然0–127表示的符號(hào)是一樣的钻弄,但是128–255這一段的解釋完全亂套了佃却,即使2進(jìn)制完全一樣,表示的字符完全不一樣窘俺,比如135在法語饲帅,希伯來語,俄語編碼中完全是不同的符號(hào)瘤泪;
更麻煩的是灶泵,這編碼傳到中國(guó)后,中國(guó)人發(fā)現(xiàn)我們有10萬多個(gè)漢字对途,你們歐美這256字塞牙縫都不夠赦邻。于是就發(fā)明了GB2312這些漢字編碼,典型的用2個(gè)字節(jié)來表示絕大部分的常用漢字实檀,最多可以表示65536個(gè)漢字字符惶洲,這樣就不難理解有些漢字你在新華字典里查得到按声,但是電腦上如果不處理一下你是顯示不出來的了吧。
這下各用各的字符集編碼湃鹊,這世界咋統(tǒng)一儒喊?俄國(guó)人發(fā)封email給中國(guó)人,兩邊字符集編碼不同币呵,尼瑪顯示都是亂碼啊怀愧。為了統(tǒng)一,于是就發(fā)明了unicode余赢,將世界上所有的符號(hào)都納入其中芯义,每一個(gè)符號(hào)都給予一個(gè)獨(dú)一無二的編碼,現(xiàn)在unicode可以容納100多萬個(gè)符號(hào)妻柒,每個(gè)符號(hào)的編碼都不一樣扛拨,這下可統(tǒng)一了,所有語言都可以互通举塔,一個(gè)網(wǎng)頁頁面里可以同時(shí)顯示各國(guó)文字绑警。
然而,unicode雖然統(tǒng)一了全世界字符的二進(jìn)制編碼央渣,但沒有規(guī)定如何存儲(chǔ)啊计盒。x86和amd體系結(jié)構(gòu)的電腦小端序和大端序都分不清,別提計(jì)算機(jī)如何識(shí)別到底是unicode還是acsii了芽丹。如果Unicode統(tǒng)一規(guī)定北启,每個(gè)符號(hào)用三個(gè)或四個(gè)字節(jié)表示,那么每個(gè)英文字母前都必然有二到三個(gè)字節(jié)是0拔第,文本文件的大小會(huì)因此大出二三倍咕村,這對(duì)于存儲(chǔ)來說是極大的浪費(fèi)。這樣導(dǎo)致一個(gè)后果:出現(xiàn)了Unicode的多種存儲(chǔ)方式蚊俺。
互聯(lián)網(wǎng)的興起懈涛,網(wǎng)頁上要顯示各種字符,必須統(tǒng)一泳猬。utf-8就是Unicode最重要的實(shí)現(xiàn)方式之一肩钠。另外還有utf-16、utf-32等暂殖。UTF-8不是固定字長(zhǎng)編碼的价匠,而是一種變長(zhǎng)的編碼方式。它可以使用1~4個(gè)字節(jié)表示一個(gè)符號(hào)呛每,根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度踩窖。這是種比較巧妙的設(shè)計(jì),如果一個(gè)字節(jié)的第一位是0晨横,則這個(gè)字節(jié)單獨(dú)就是一個(gè)字符洋腮;如果第一位是1箫柳,則連續(xù)有多少個(gè)1,就表示當(dāng)前字符占用多少個(gè)字節(jié)啥供。
注意unicode的字符編碼和utf-8的存儲(chǔ)編碼表示是不同的悯恍,例如”嚴(yán)”字的Unicode碼是4E25,UTF-8編碼是E4B8A5伙狐,這個(gè)7里面解釋了的涮毫,UTF-8編碼不僅考慮了編碼,還考慮了存儲(chǔ)贷屎,E4B8A5是在存儲(chǔ)識(shí)別編碼的基礎(chǔ)上塞進(jìn)了4E25罢防。
UTF-8 使用一至四個(gè)字節(jié)為每個(gè)字符編碼。128 個(gè) ASCII 字符(Unicode 范圍由 U+0000 至 U+007F)只需一個(gè)字節(jié)唉侄,帶有變音符號(hào)的拉丁文咒吐、希臘文、西里爾字母属划、亞美尼亞語恬叹、希伯來文、阿拉伯文同眯、敘利亞文及馬爾代夫語(Unicode 范圍由 U+0080 至 U+07FF)需要二個(gè)字節(jié)绽昼,其他基本多文種平面(BMP)中的字符(CJK屬于此類-Qieqie注)使用三個(gè)字節(jié),其他 Unicode 輔助平面的字符使用四字節(jié)編碼嗽测。
所以知道utf-8的中文是一個(gè)字符占幾個(gè)字節(jié)了吧绪励?
————————————————
版權(quán)聲明:本文為CSDN博主「KindSuper_liu」的原創(chuàng)文章肿孵,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議唠粥,轉(zhuǎn)載請(qǐng)附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/kindsuper_liu/article/details/80202150