之前一直搞不懂 gb2312 gbk ASCII utf8 utf32 這些7788的東西。
現(xiàn)在我談一下對(duì)他的理解。
因?yàn)橛?jì)算機(jī)底層是01010101010這種的2進(jìn)制存儲(chǔ)眠蚂,所以你存儲(chǔ)的時(shí)候怎么把這種01010的二進(jìn)制在轉(zhuǎn)換的時(shí)候變成中文或英文還有一些表情或則+-乘除這些符號(hào)呢。
其實(shí)這個(gè)就是字符集通俗講就是2進(jìn)制的不同位代表的每個(gè)中文或英文這些東西
比如1個(gè)字節(jié)8位
假如0000 0001 代表 中文 我
0000 0002 代表中文 愛
那么計(jì)算機(jī)底層就會(huì)存儲(chǔ)
00000001 00000002 就是 我愛 就可以翻譯過來了 空格為了方便查看 但是 但是 這是我獨(dú)家定義的對(duì)應(yīng)關(guān)系
實(shí)際上ASCII 和 gbk gb2312 Unicode 都是分別定義了 這種關(guān)系就是這個(gè)意思 他們是一類的 都叫字符集
這個(gè)時(shí)候有人說gbk不是編碼格式么 下面會(huì)講解
ASCII 這個(gè)玩意是最早出來的字符集 他都是英文字母和基本符號(hào) 因?yàn)橛⑽臎]多少字母所以 1個(gè)字節(jié)就搞定了對(duì)應(yīng)關(guān)系
但是中國文字多 中國又定義了一份 gb2312 用了2個(gè)字節(jié) 也就是65535 可以標(biāo)識(shí)大多數(shù)中文 所以又出現(xiàn)一個(gè)字符集
然后 后期gbk是對(duì) gb2312的升級(jí) 加入了 日語韓語 好像也是2個(gè)字節(jié) 這個(gè)我沒太詳細(xì)去查詢
還有其他的字符集香港自己的字符集
這么多字符集所以存的都是0100110101010這種2進(jìn)制 但是不同字符集對(duì)應(yīng)的 含義肯定不完全相同所以需要一個(gè)統(tǒng)一的字符集 這個(gè)時(shí)候 出現(xiàn)了 unicode 就是它統(tǒng)一了字符集
所以u(píng)nicode可以標(biāo)識(shí)任何的你想標(biāo)識(shí)的中文英文符號(hào)其他語言等等胀糜。
說到這里字符集應(yīng)該說明白了
下面講講為什么需要utf8這個(gè)東西
還是拿我上面講的獨(dú)家對(duì)應(yīng)關(guān)系舉例子
假如0000 0001 代表 中文 我
0000 0002 代表中文 愛
那么計(jì)算機(jī)底層就會(huì)存儲(chǔ)
00000001 00000002 就是 我愛
空格是為了閱讀的你方便區(qū)分 那如果 計(jì)算機(jī)底層沒有空格他怎么區(qū)分呢
前面說中文太多 1個(gè)字節(jié)肯定表示不夠用 那么可能 你字 這個(gè)中文 需要2個(gè)字節(jié)表示 如下
0000000100000002
那么我愛你就表示成 00000001 00000002 0000000100000002
我加了空格可能你可以看得懂計(jì)算機(jī)底層沒空格 那么這段可以解釋成 我愛你 也可以解釋成 我愛我愛
因?yàn)樯厦嫖沂?0000001 00000002 0000000100000002 這樣斷句的 如果 我改成
00000001 00000002 00000001 00000002 這樣斷句是不是 就是我愛我愛了
計(jì)算機(jī)底層存儲(chǔ)可以理解為 00000001000000020000000100000002 所以你不告訴他怎么斷句它也不知道
utf8就是為了解決 unicode存儲(chǔ)可能出現(xiàn)歧義出現(xiàn)的 一種編碼格式。
說到這里 如果你能豁然開朗請給我個(gè)贊 然后接著看。
為什么說utf8這么受歡迎因?yàn)?他是可變長度的 怎么理解呢 看下面
Unicode編碼 UTF-8編碼(二進(jìn)制)
U+0000 – U+007F 0xxxxxxx
U+0080 – U+07FF 110xxxxx 10xxxxxx
U+0800 – U+FFFF 1110xxxx 10xxxxxx 10xxxxxx
U+10000 – U+10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
最開始我看到這個(gè)一臉懵逼褥实,網(wǎng)上好多文章講這個(gè)規(guī)則但是我總是get不到點(diǎn)
utf8 編碼方式 是對(duì) unicode字符集的一個(gè)存儲(chǔ)到計(jì)算機(jī)2進(jìn)制的實(shí)現(xiàn)
unicode表示那么多字符了 肯定有 00000001就可以表示的 也有 011111110000110000100多個(gè)字節(jié)表示的字符
utf8規(guī)定了4個(gè)范圍 就是上面的對(duì)照圖 你看到 上面圖中1110xxxx 11110xxx 110xxx 0xxx不知道你發(fā)現(xiàn)規(guī)律沒有
實(shí)際上這些就是為了讓計(jì)算機(jī)底層可以對(duì)2進(jìn)制進(jìn)行區(qū)分當(dāng)發(fā)現(xiàn)0開頭的字節(jié) 就讀1個(gè)字節(jié)就翻譯
當(dāng)發(fā)現(xiàn)110開頭的字節(jié)就讀兩個(gè)字節(jié)就翻譯 1110 11110依次類推 所以計(jì)算機(jī)底層就知道了讀多少字節(jié)翻譯對(duì)應(yīng)字符了 就不會(huì)出現(xiàn) 我愛你 變成我愛我愛了
為什么規(guī)定了4個(gè)范圍就是為了 unicode 表示少的時(shí)候省點(diǎn)空間 所以根據(jù)前面的區(qū)間 放對(duì)應(yīng)的數(shù)據(jù)到后面xxxx中前面0 110 1110 11110 都是固定的 為了讓計(jì)算機(jī)底層斷句用的 類似我給你 敲的空格 如果utf8你搞明白了
unicode肯定有對(duì)應(yīng)的換算成2進(jìn)制的數(shù) 對(duì)應(yīng)的向滿足區(qū)間的utf8的那些xxxx中去填就行了 然后會(huì)得到新的2進(jìn)制值這個(gè)時(shí)候就是utf8的編碼值
下面說說gbk編碼 你有的時(shí)候也會(huì)寫成gbk編碼 剛剛我說他不是 字符集么 遍希,他確實(shí)是字符集等曼,但是他定長了啊 他規(guī)定2個(gè)字節(jié) 翻譯一次 即使 是 00000001 也存成00000000 00000001 所以就是空間浪費(fèi) 但是不會(huì)歧義
所以他也是編碼格式。
utf32也是定長 凿蒜,但是他不是字符集 他是實(shí)現(xiàn)方式對(duì)unicode的實(shí)現(xiàn)方式 對(duì)比utf8缺點(diǎn)就是空間浪費(fèi) 所以不常用禁谦。
講完了希望我的 通俗講解對(duì)你有幫助。
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者