【转】utf-8的中文是一个汉字占三个字节长度
因為看到百度里面這個人回答比較生動,印象比較深刻,所以轉(zhuǎn)過來做個筆記
原文鏈接 https://zhidao.baidu.com/question/1047887004693001899.html
知乎也有更清晰解答 https://www.zhihu.com/question/23374078
?
1、美國人首先對其英文字符進行了編碼,也就是最早的ascii碼,用一個字節(jié)的低7位來表示英文的128個字符,高1位統(tǒng)一為0;
2、后來歐洲人發(fā)現(xiàn)尼瑪你這128位哪夠用,比如我高貴的法國人字母上面的還有注音符,這個怎么區(qū)分,得,把高1位編進來吧,這樣歐洲普遍使用一個全字節(jié)進行編碼,最多可表示256位。歐美人就是喜歡直來直去,字符少,編碼用得位數(shù)少;
3、但是即使位數(shù)少,不同國家地區(qū)用不同的字符編碼,雖然0--127表示的符號是一樣的,但是128--255這一段的解釋完全亂套了,即使2進制完全一樣,表示的字符完全不一樣,比如135在法語,希伯來語,俄語編碼中完全是不同的符號;
4、更麻煩的是,尼瑪這電腦高科技傳到中國后,中國人發(fā)現(xiàn)我們有10萬多個漢字,你們歐美這256字塞牙縫都不夠。于是就發(fā)明了GB2312這些漢字編碼,典型的用2個字節(jié)來表示絕大部分的常用漢字,最多可以表示65536個漢字字符,這樣就不難理解有些漢字你在新華字典里查得到,但是電腦上如果不處理一下你是顯示不出來的了吧。
5、這下各用各的字符集編碼,這世界咋統(tǒng)一?俄國人發(fā)封email給中國人,兩邊字符集編碼不同,尼瑪顯示都是亂碼啊。為了統(tǒng)一,于是就發(fā)明了unicode,將世界上所有的符號都納入其中,每一個符號都給予一個獨一無二的編碼,現(xiàn)在unicode可以容納100多萬個符號,每個符號的編碼都不一樣,這下可統(tǒng)一了,所有語言都可以互通,一個網(wǎng)頁頁面里可以同時顯示各國文字。
6、然而,unicode雖然統(tǒng)一了全世界字符的二進制編碼,但沒有規(guī)定如何存儲啊,親。x86和amd體系結(jié)構(gòu)的電腦小端序和大端序都分不清,別提計算機如何識別到底是unicode還是acsii了。如果Unicode統(tǒng)一規(guī)定,每個符號用三個或四個字節(jié)表示,那么每個英文字母前都必然有二到三個字節(jié)是0,文本文件的大小會因此大出二三倍,這對于存儲來說是極大的浪費。這樣導(dǎo)致一個后果:出現(xiàn)了Unicode的多種存儲方式。
7、互聯(lián)網(wǎng)的興起,網(wǎng)頁上要顯示各種字符,必須統(tǒng)一啊,親。utf-8就是Unicode最重要的實現(xiàn)方式之一。另外還有utf-16、utf-32等。UTF-8不是固定字長編碼的,而是一種變長的編碼方式。它可以使用1~4個字節(jié)表示一個符號,根據(jù)不同的符號而變化字節(jié)長度。這是種比較巧妙的設(shè)計,如果一個字節(jié)的第一位是0,則這個字節(jié)單獨就是一個字符;如果第一位是1,則連續(xù)有多少個1,就表示當(dāng)前字符占用多少個字節(jié)。
8、注意unicode的字符編碼和utf-8的存儲編碼表示是不同的,例如"嚴(yán)"字的Unicode碼是4E25,UTF-8編碼是E4B8A5,這個7里面解釋了的,UTF-8編碼不僅考慮了編碼,還考慮了存儲,E4B8A5是在存儲識別編碼的基礎(chǔ)上塞進了4E25。
9、UTF-8 使用一至四個字節(jié)為每個字符編碼。128 個 ASCII 字符(Unicode 范圍由 U 0000 至 U 007F)只需一個字節(jié),帶有變音符號的拉丁文、希臘文、西里爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文及馬爾代夫語(Unicode 范圍由 U 0080 至 U 07FF)需要二個字節(jié),其他基本多文種平面(BMP)中的字符(CJK屬于此類-Qieqie注)使用三個字節(jié),其他 Unicode 輔助平面的字符使用四字節(jié)編碼。
10、最后,要回答你的問題,常規(guī)來看,中文漢字在utf-8中到底占幾個字節(jié),一般是3個字節(jié),最常見的編碼方式是1110xxxx 10xxxxxx 10xxxxxx。
?
Unicode符號范圍 | UTF-8編碼方式
(十六進制) | (二進制)
—————————————————————–
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
跟據(jù)上表,解讀UTF-8編碼非常簡單。如果一個字節(jié)的第一位是0,則這個字節(jié)單獨就是一個字符;如果第一位是1,則連續(xù)有多少個1,就表示當(dāng)前字符占用多少個字節(jié)。下面,還是以漢字"嚴(yán)"為例,演示如何實現(xiàn)UTF-8編碼。已知"嚴(yán)"的unicode是4E25(100111000100101),根據(jù)上表,可以發(fā)現(xiàn)4E25處在第三行的范圍內(nèi)(0000 0800-0000 FFFF),因此"嚴(yán)"的UTF-8編碼需要三個字節(jié),即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,從"嚴(yán)"的最后一個二進制位開始,依次從后向前填入格式中的x,多出的位補0。這樣就得到了,"嚴(yán)"的UTF-8編碼是"11100100 10111000 10100101",轉(zhuǎn)換成十六進制就是E4B8A5。
總結(jié)
以上是生活随笔為你收集整理的【转】utf-8的中文是一个汉字占三个字节长度的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CSS 属性 - 伪类和伪元素的区别
- 下一篇: 关于css透明度的问题