什么是編碼?什么是 Unicode 編碼段直?
編碼是為了將人能識別的字符數(shù)字化吃溅,使得計算機(jī)能夠“看”懂
我們知道,計算機(jī)只能處理2進(jìn)制數(shù)字鸯檬,即 0 或 1 决侈,而人能看懂的是一些有意義的字符。因此喧务,這里就需要將人類能看懂的語言字符轉(zhuǎn)換為計算機(jī)能看懂的數(shù)字序列(0 1序列)赖歌,這個過程就是編碼枉圃。
計算機(jī)的編碼類型經(jīng)歷了一個由分到合的過程。由于計算機(jī)是美國人發(fā)明的俏站,所以他們首先提出了一種 ASCII 編碼讯蒲,這種類型的編碼將英文世界中的字母和其他符號(如 ! @ # 這類字符)用計算機(jī)中的一個字節(jié)來表示(計算機(jī)中 bit 是最小的處理單位,1字節(jié) = 8 bit 肄扎,因此一個字節(jié)最多可表示 255 個字符)墨林。打個比方,在ASCII碼中犯祠,大寫字母 U
就表示成 01010101
旭等,我們在計算機(jī)上輸入一個 U
,在計算機(jī)看來實際上是 01010101
的二進(jìn)制串衡载。這下美國人使用計算機(jī)的問題解決了搔耕。
然而中國人也要上網(wǎng),中國人民也想搞出自己的編碼痰娱。但是問題出現(xiàn)了弃榨,除去一些特殊字符,英文世界的語言可以用26個字母排列表示梨睁,然而我國漢字千千萬萬鲸睛,僅僅1個字節(jié)是無法表示的,于是我們想到了用兩個字節(jié)表示一個漢字——GB2312 編碼就應(yīng)運而生坡贺。而且另一個好處在于官辈,GB2312 編碼可以兼容 ASCII 編碼。而此時遍坟,世界上的其他國家也根據(jù)自己的文字特點制定出了自己國家的編碼拳亿。
Unicode 編碼可以解決亂碼問題
各國都有了自己的編碼后又面對交流上的問題——比方說一個漢字在ASCII碼的機(jī)器上會被識別為一群亂碼。為了解決各國間編碼不統(tǒng)一的問題愿伴,國際標(biāo)準(zhǔn)化組織(ISO)和多語言軟件制造商這兩個組織合作搞出了 unicode編碼肺魁,它將所有語言統(tǒng)一到一套編碼。 unicode 編碼采用兩個字節(jié)來表示一個字符隔节,這可以涵蓋世界上主流使用的字符万搔。
什么是 utf-8 編碼? unicode 和 utf-8 編碼之間有何關(guān)系官帘?
utf-8 可以解決利用 Unicode 存儲造成資源浪費的問題
我們看一下 ASCII 和 Unicode 編碼。ASCII編碼中昧谊,U
對應(yīng)二進(jìn)制序列是01010101刽虹,
而在 Unicode中,U
對應(yīng)的二進(jìn)制序列是0000000001010101
呢诬∮空埽可見胖缤,同樣表示一個英文字符,利用 Unicode 編碼較 ASCII編碼將多花費一倍的存儲空間阀圾,如果存儲1T的英文資料哪廓,利用 Unicode 將占用2T的資源,這是極大的資源浪費初烘!
將Unicode編碼轉(zhuǎn)換為utf-8編碼一般(英文字符居多的情況)可以節(jié)省存儲空間涡真。詳細(xì)的Unicode轉(zhuǎn)utf-8編碼的規(guī)則這里不做介紹,有興趣可以搜索“ utf-8 編碼規(guī)則”肾筐。
utf-8 編碼一般可以減少字符編碼的長度(特別是英文字符較多的情況)哆料,因此它廣泛運用在存儲和傳輸?shù)那樾蜗隆5?utf-8 也不是沒有缺點吗铐,由于在 utf-8 編碼的規(guī)則下中英文的編碼長度不同东亦,因此這使得我們在內(nèi)存中操作它們時變得很復(fù)雜。所以我們在內(nèi)存中操作的字符使用的一般是 Unicode 編碼唬渗,比如 Python 典阵。下面一張圖將清楚的描述出 Unicode 和 utf-8 編碼的關(guān)系。
總結(jié)
編碼是信息從一種形式轉(zhuǎn)換為另一種形式的過程镊逝。
Unicode 編碼解決了各國間編碼格式不兼容的問題壮啊,運用在內(nèi)存處理中。
utf-8 編碼是一種可變長編碼蹋半,是 Unicode 編碼根據(jù)一套規(guī)則轉(zhuǎn)換而來的他巨,運用在傳輸和存儲中。
根據(jù)使用場景我們需要選擇合適的編碼形式减江。