北京艾銻無(wú)限告訴您:Unicode 和 UTF-8 的區(qū)別
2020-02-13 16:43 作者:admin 瀏覽量:
迎戰(zhàn)疫情,艾銻無(wú)限用愛(ài)與您同行
為中國(guó)中小企業(yè)提供免費(fèi)IT外包服務(wù)
這次的肺炎疫情對(duì)中國(guó)的中小企業(yè)將會(huì)是沉重的打擊,據(jù)釘釘和微信兩個(gè)辦公平臺(tái)數(shù)據(jù)統(tǒng)計(jì)現(xiàn)有2億左右的人在家遠(yuǎn)程辦公,那么對(duì)于中小企業(yè)的員工來(lái)說(shuō)不懂IT技術(shù)將會(huì)讓他們面臨的最大挑戰(zhàn)和困難。
電腦不亮了怎么辦?系統(tǒng)藍(lán)屏如何處理?辦公室的電腦在家如何連接?網(wǎng)絡(luò)應(yīng)該如何設(shè)置?VPN如何搭建?數(shù)據(jù)如何對(duì)接?服務(wù)器如何登錄?數(shù)據(jù)安全如何保證?數(shù)據(jù)如何存儲(chǔ)?視頻會(huì)議如何搭建?業(yè)務(wù)系統(tǒng)如何開(kāi)啟等等一系列的問(wèn)題,都會(huì)困擾著并非技術(shù)出身的您。
好消息是當(dāng)您看到這篇文章的時(shí)候,就不用再為上述的問(wèn)題而苦惱,您只需撥打艾銻無(wú)限的全國(guó)免費(fèi)熱線電話:400 650 7820,就會(huì)有我們的遠(yuǎn)程工程師為您解決遇到的問(wèn)題,他們可以遠(yuǎn)程幫您處理遇到的一些IT技術(shù)難題。
如遇到免費(fèi)熱線占線,您還可以撥打我們的24小時(shí)值班經(jīng)理電話:15601064618或技術(shù)經(jīng)理的電話:13041036957,我們會(huì)在第一時(shí)間接聽(tīng)您的來(lái)電,為您提供適合的解決方案,讓您無(wú)論在家還是在企業(yè)都能無(wú)憂辦公。
那艾銻無(wú)限具體能為您的企業(yè)提供哪些服務(wù)呢?
艾銻無(wú)限始創(chuàng)于2005年,歷經(jīng)15年服務(wù)了5000多家中小企業(yè)并保障了幾十萬(wàn)臺(tái)設(shè)備的正常運(yùn)轉(zhuǎn),積累了豐富的企業(yè)IT緊急問(wèn)題和特殊故障的解決經(jīng)驗(yàn),制定了相對(duì)應(yīng)的解決方案。我們?yōu)槟钠髽I(yè)提供的IT服務(wù)分為三大版塊:
第一版塊是保障性IT外包服務(wù):如電腦設(shè)備運(yùn)維,辦公設(shè)備運(yùn)維,網(wǎng)絡(luò)設(shè)備運(yùn)維,服務(wù)器運(yùn)維等綜合性企業(yè)IT設(shè)備運(yùn)維服務(wù)。
第二版塊是功能性互聯(lián)網(wǎng)外包服務(wù):如網(wǎng)站開(kāi)發(fā)外包,小程序開(kāi)發(fā)外包,APP開(kāi)發(fā)外包,電商平臺(tái)開(kāi)發(fā)外包,業(yè)務(wù)系統(tǒng)的開(kāi)發(fā)外包和后期的運(yùn)維外包服務(wù)。
第三版塊是增值性云服務(wù)外包:如企業(yè)郵箱上云,企業(yè)網(wǎng)站上云,企業(yè)存儲(chǔ)上云,企業(yè)APP小程序上云,企業(yè)業(yè)務(wù)系統(tǒng)上云,阿里云產(chǎn)品等后續(xù)的云運(yùn)維外包服務(wù)。
您要了解更多服務(wù)也可以登錄艾銻無(wú)限的官網(wǎng):
www.bjitwx.com查看詳細(xì)說(shuō)明,
在疫情期間,您企業(yè)遇到的任何困境只要找到艾銻無(wú)限,能免費(fèi)為您提供服務(wù)的我們絕不收一分錢,我們?nèi)w艾銻人承諾此活動(dòng)直到中國(guó)疫情結(jié)束,我們將這次活動(dòng)稱為——春雷行動(dòng)。
以下還有我們?yōu)槟峁┑囊恍┘夹g(shù)資訊,以便可以幫助您更好的了解相關(guān)的IT知識(shí),幫您渡過(guò)疫情中辦公遇到的困難和挑戰(zhàn),艾銻無(wú)限愿和中國(guó)中小企業(yè)一起共進(jìn)退,因?yàn)槲覀兿嘈湃f(wàn)物同體,能量合一,只要我們一起齊心協(xié)力,一定會(huì)成功。再一次祝福您和您的企業(yè),戰(zhàn)勝疫情,您和您的企業(yè)一定行。
北京艾銻無(wú)限告訴您:Unicode 和 UTF-8 的區(qū)別
很久很久以前,有一群人,他們決定用8個(gè)可以開(kāi)合的晶體管來(lái)組合成不同的狀態(tài),以表示世界上的萬(wàn)物。他們看到8個(gè)開(kāi)關(guān)狀態(tài)是好的,于是他們把這稱為”
字節(jié)“。再后來(lái),他們又做了一些可以處理這些字節(jié)的機(jī)器,機(jī)器開(kāi)動(dòng)了,可以用字節(jié)來(lái)組合出很多狀態(tài),狀態(tài)開(kāi)始變來(lái)變?nèi)ァK麄兛吹竭@樣是好的,于是它們就這機(jī)器稱為”
計(jì)算機(jī)“。
開(kāi)始計(jì)算機(jī)只在美國(guó)用。八位的字節(jié)一共可以組合出256(2的8次方)種不同的狀態(tài)。
他們把其中的編號(hào)從0開(kāi)始的32種狀態(tài)分別規(guī)定了特殊的用途,一但終端、打印機(jī)遇上約定好的這些字節(jié)被傳過(guò)來(lái)時(shí),就要做一些約定的動(dòng)作:
遇上0×10, 終端就換行;
遇上0×07, 終端就向人們嘟嘟叫;
遇上0x1b, 打印機(jī)就打印反白的字,或者終端就用彩色顯示字母。
他們看到這樣很好,于是就把這些0×20以下的字節(jié)狀態(tài)稱為”控制碼”。他們又把所有的空
格、標(biāo)點(diǎn)符號(hào)、數(shù)字、大小寫(xiě)字母分別用連續(xù)的字節(jié)狀態(tài)表示,一直編到了第127號(hào),這樣計(jì)算機(jī)就可以用不同字節(jié)來(lái)存儲(chǔ)英語(yǔ)的文字了。大家看到這樣,都感覺(jué)
很好,于是大家都把這個(gè)方案叫做
ANSI 的”Ascii”編碼(American Standard Code for Information Interchange,美國(guó)信息互換標(biāo)準(zhǔn)代碼)。當(dāng)時(shí)世界上所有的計(jì)算機(jī)都用同樣的
ASCII方案來(lái)保存英文文字。
后來(lái),就像建造巴比倫塔一樣,世界各地都開(kāi)始使用計(jì)算機(jī),但是很多國(guó)家用的不是英文,他們的字母里有許多是ASCII里沒(méi)有的,為了可以在計(jì)算機(jī)保存他們的文字,他們決定采用
127號(hào)之后的空位來(lái)表示這些新的字母、符號(hào),還加入了很多畫(huà)表格時(shí)需要用下到的橫線、豎線、交叉等形狀,一直把序號(hào)編到了最后一個(gè)狀態(tài)255。從128 到255這一頁(yè)的字符集被稱”
擴(kuò)展字符集“。從此之后,貪婪的人類再?zèng)]有新的狀態(tài)可以用了,美帝國(guó)主義可能沒(méi)有想到還有第三世界國(guó)家的人們也希望可以用到計(jì)算機(jī)吧!等中國(guó)人們得到計(jì)算機(jī)時(shí),已經(jīng)沒(méi)有可以利用的字節(jié)狀態(tài)來(lái)表示漢字,況且有6000多個(gè)常用漢字需要保存呢。但是這難不倒智慧的中國(guó)人民,我們不客氣地把那些127號(hào)之后的奇異符號(hào)們直接取消掉, 規(guī)定:一個(gè)小于127的字符的意義與原來(lái)相同,但兩個(gè)大于127的字符連在一起時(shí),就表示一個(gè)漢字,前面的一個(gè)字節(jié)(他稱之為高字節(jié))從0xA1用到0xF7,后面一個(gè)字節(jié)(低字節(jié))從0xA1到0xFE,這樣我們就可以組合出大約7000多個(gè)簡(jiǎn)體漢字了。在這些編碼里,我們還把數(shù)學(xué)符號(hào)、羅馬希臘的字母、日文的假名們都編進(jìn)去了,連在 ASCII 里本來(lái)就有的數(shù)字、標(biāo)點(diǎn)、字母都統(tǒng)統(tǒng)重新編了兩個(gè)字節(jié)長(zhǎng)的編碼,這就是常說(shuō)的”全角”字符,而原來(lái)在127號(hào)以下的那些就叫”半角”字符了。中國(guó)人民看到這樣很不錯(cuò),于是就把這種漢字方案叫做 “
GB2312“。GB2312 是對(duì) ASCII 的中文擴(kuò)展。
但是中國(guó)的漢字太多了,我們很快就就發(fā)現(xiàn)有許多人的人名沒(méi)有辦法在這里打出來(lái),特別是某些很會(huì)麻煩別人的國(guó)家領(lǐng)導(dǎo)人。于是我們不得不繼續(xù)把GB2312 沒(méi)有用到的碼位找出來(lái)老實(shí)不客氣地用上。后來(lái)還是不夠用,于是干脆不再要求低字節(jié)一定是127號(hào)之后的內(nèi)碼,只要第一個(gè)字節(jié)是大于127就固定表示這是一個(gè)漢字的開(kāi)始,不管后面跟的是不是擴(kuò)展字
符集里的內(nèi)容。結(jié)果擴(kuò)展之后的編碼方案被稱為
GBK 標(biāo)準(zhǔn),GBK包括了GB2312 的所有內(nèi)容,同時(shí)又增加了近20000個(gè)新的漢字(包括繁體字)和符號(hào)。 后來(lái)少數(shù)民族也要用電腦了,于是我們?cè)贁U(kuò)展,又加了幾千個(gè)新的少數(shù)民族的字,GBK擴(kuò)成了
GB18030。從此之后,中華民族的文化就可以在計(jì)算機(jī)時(shí)代中傳承了。 中國(guó)的程序員們看到這一系列漢字編碼的標(biāo)準(zhǔn)是好的,于是通稱他們叫做 “
DBCS“(Double Byte Charecter Set 雙字節(jié)字符集)。在DBCS系列標(biāo)準(zhǔn)里,最大的特點(diǎn)是兩字節(jié)長(zhǎng)的漢字字符和一字節(jié)長(zhǎng)的英文字符并存于同一套編碼方案里,因此他們寫(xiě)的程序?yàn)榱酥С种形奶幚恚仨氁⒁庾执锏拿恳粋€(gè)字節(jié)的值,如果這個(gè)值是大于127的,那么就認(rèn)為一個(gè)雙字節(jié)字符集里的字符出現(xiàn)了。那時(shí)候凡是受過(guò)加持,會(huì)編程的計(jì)算機(jī)僧侶們都要每天念下面這個(gè)咒語(yǔ)數(shù)百遍: “一個(gè)漢字算兩個(gè)英文字符!一個(gè)漢字算兩個(gè)英文字符……”
因?yàn)楫?dāng)時(shí)各個(gè)國(guó)家都像中國(guó)這樣搞出一套自己的編碼標(biāo)準(zhǔn),結(jié)果互相之間誰(shuí)也不懂誰(shuí)的編碼,誰(shuí)也不支持別人的編碼,連大陸和臺(tái)灣這樣只相隔了150海里,使用著同一種語(yǔ)言的兄弟地區(qū),也分別采用了不同的 DBCS 編碼方案——當(dāng)時(shí)的中國(guó)人想讓電腦顯示漢字,就必須裝上一個(gè)”漢字系統(tǒng)”,專門用來(lái)處理漢字的顯示、輸入的問(wèn)題,像是那個(gè)臺(tái)灣的愚昧封建人士寫(xiě)的算命程序就必須加裝另一套支持 BIG5 編碼的什么”倚天漢字系統(tǒng)”才可以用,裝錯(cuò)了字符系統(tǒng),顯示就會(huì)亂了套!這怎么辦?而且世界民族之林中還有那些一時(shí)用不上電腦的窮苦人民,他們的文字又怎么辦? 真是計(jì)算機(jī)的巴比倫塔命題啊!
正在這時(shí),大天使加百列及時(shí)出現(xiàn)了——一個(gè)叫
ISO(國(guó)際標(biāo)誰(shuí)化組織)的國(guó)際組織決定著手解決這個(gè)問(wèn)題。他們采用的方法很簡(jiǎn)單:廢了所有的地區(qū)性編碼方案,重新搞一個(gè)包括了地球上所有文化、所有字母和符號(hào) 的編碼!他們打算叫它”Universal Multiple-Octet Coded Character Set”,簡(jiǎn)稱
UCS, 俗稱 “
unicode“。
unicode開(kāi)始制訂時(shí),計(jì)算機(jī)的存儲(chǔ)器容量極大地發(fā)展了,空間再也不成為問(wèn)題了。于是 ISO
就直接規(guī)定必須用兩個(gè)字節(jié),也就是16位來(lái)統(tǒng)一表示所有的字符,對(duì)于ASCII里的那些“半角”字符,unicode包持其原編碼不變,只是將其長(zhǎng)度由原來(lái)的8位擴(kuò)展為16位,而其他文化和語(yǔ)言的字符則全部重新統(tǒng)一編碼。由于”半角”英文符號(hào)只需要用到低8位,所以其高8位永遠(yuǎn)是0,因此這種大氣的方案在保存英文文本時(shí)會(huì)多浪費(fèi)一倍的空間。這時(shí)候,從舊社會(huì)里走過(guò)來(lái)的程序員開(kāi)始發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象:他們的
strlen 函數(shù)靠不住了,一個(gè)漢字不再是相當(dāng)于兩個(gè)字符了,而是一個(gè)!是的,從unicode開(kāi)始,無(wú)論是半角的英文字母,還是全角的漢字,它們都是統(tǒng)一的”
一個(gè)字符“!同時(shí),也都是統(tǒng)一的”
兩個(gè)字節(jié)“,請(qǐng)注意”字符”和”字節(jié)”兩個(gè)術(shù)語(yǔ)的不同,“
字節(jié)”是一個(gè)8位的物理存貯單元,而“
字符”則是一個(gè)文化相關(guān)的符號(hào)。在unicode中,一個(gè)字符就是兩個(gè)字節(jié)。一個(gè)漢字算兩個(gè)英文字符的時(shí)代已經(jīng)快過(guò)去了。
unicode同樣也不完美,這里就有兩個(gè)的問(wèn)題,一個(gè)是,如何才能區(qū)別unicode和ascii?計(jì)算機(jī)怎么知道三個(gè)字節(jié)表示一個(gè)符號(hào),而不是分別表示三個(gè)符號(hào)呢?第二個(gè)問(wèn)題是,我們已經(jīng)知道,英文字母只用一個(gè)字節(jié)表示就夠了,如果unicode統(tǒng)一規(guī)定,每個(gè)符號(hào)用三個(gè)或四個(gè)字節(jié)表示,那么每個(gè)英文字母前都必然有二到三個(gè)字節(jié)是0,這對(duì)于存儲(chǔ)空間來(lái)說(shuō)是極大的浪費(fèi),文本文件的大小會(huì)因此大出二三倍,這是難以接受的。
unicode在很長(zhǎng)一段時(shí)間內(nèi)無(wú)法推廣,直到互聯(lián)網(wǎng)的出現(xiàn),為解決unicode如何在網(wǎng)絡(luò)上傳輸?shù)膯?wèn)題,于是面向傳輸?shù)谋姸?
UTF(UCS Transfer Format)標(biāo)準(zhǔn)出現(xiàn)了,顧名思義,
UTF-8就是每次8個(gè)位傳輸數(shù)據(jù),而
UTF-16就是每次16個(gè)位。UTF-8就是在互聯(lián)網(wǎng)上使用最廣的一種unicode的實(shí)現(xiàn)方式,這是為傳輸而設(shè)計(jì)的編碼,并使編碼無(wú)國(guó)界,這樣就可以顯示全世界上所有文化的字符了。UTF-8最大的一個(gè)特點(diǎn),就是它是一種變長(zhǎng)的編碼方式。它可以使用1~4個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度,當(dāng)字符在ASCII碼的范圍時(shí),就用一個(gè)字節(jié)表示,保留了ASCII字符一個(gè)字節(jié)的編碼做為它的一部分,注意的是unicode一個(gè)中文字符占2個(gè)字節(jié),而UTF-8一個(gè)中文字符占3個(gè)字節(jié))。從unicode到utf-8并不是直接的對(duì)應(yīng),而是要過(guò)一些算法和規(guī)則來(lái)轉(zhuǎn)換。
Unicode符號(hào)范圍 | UTF-8編碼方式
(十六進(jìn)制) | (二進(jìn)制)
—————————————————————–
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
最后簡(jiǎn)單總結(jié)一下:
· 中國(guó)人民通過(guò)對(duì) ASCII 編碼的中文擴(kuò)充改造,產(chǎn)生了 GB2312 編碼,可以表示6000多個(gè)常用漢字。
· 漢字實(shí)在是太多了,包括繁體和各種字符,于是產(chǎn)生了 GBK 編碼,它包括了 GB2312 中的編碼,同時(shí)擴(kuò)充了很多。
· 中國(guó)是個(gè)多民族國(guó)家,各個(gè)民族幾乎都有自己獨(dú)立的語(yǔ)言系統(tǒng),為了表示那些字符,繼續(xù)把 GBK 編碼擴(kuò)充為 GB18030 編碼。
· 每個(gè)國(guó)家都像中國(guó)一樣,把自己的語(yǔ)言編碼,于是出現(xiàn)了各種各樣的編碼,如果你不安裝相應(yīng)的編碼,就無(wú)法解釋相應(yīng)編碼想表達(dá)的內(nèi)容。
· 終于,有個(gè)叫 ISO 的組織看不下去了。他們一起創(chuàng)造了一種編碼 UNICODE ,這種編碼非常大,大到可以容納世界上任何一個(gè)文字和標(biāo)志。所以只要電腦上有 UNICODE 這種編碼系統(tǒng),無(wú)論是全球哪種文字,只需要保存文件的時(shí)候,保存成 UNICODE 編碼就可以被其他電腦正常解釋。
· UNICODE 在網(wǎng)絡(luò)傳輸中,出現(xiàn)了兩個(gè)標(biāo)準(zhǔn) UTF-8 和 UTF-16,分別每次傳輸 8個(gè)位和 16個(gè)位。于是就會(huì)有人產(chǎn)生疑問(wèn),UTF-8 既然能保存那么多文字、符號(hào),為什么國(guó)內(nèi)還有這么多使用 GBK 等編碼的人?因?yàn)?UTF-8 等編碼體積比較大,占電腦空間比較多,如果面向的使用人群絕大部分都是中國(guó)人,用 GBK 等編碼也可以。
簡(jiǎn)單來(lái)說(shuō):
· Unicode 是「字符集」
· UTF-8 是「編碼規(guī)則」
其中:
· 字符集:為每一個(gè)「字符」分配一個(gè)唯一的 ID(學(xué)名為碼位 / 碼點(diǎn) / Code Point)
· 編碼規(guī)則:將「碼位」轉(zhuǎn)換為字節(jié)序列的規(guī)則(編碼/解碼 可以理解為 加密/解密 的過(guò)程)
廣義的 Unicode 是一個(gè)標(biāo)準(zhǔn),定義了一個(gè)字符集以及一系列的編碼規(guī)則,即 Unicode 字符集和 UTF-8、UTF-16、UTF-32 等等編碼……
Unicode 字符集為每一個(gè)字符分配一個(gè)碼位,例如「知」的碼位是 30693,記作 U+77E5(30693 的十六進(jìn)制為 0x77E5)。
UTF-8 顧名思義,是一套以 8 位為一個(gè)編碼單位的可變長(zhǎng)編碼。會(huì)將一個(gè)碼位編碼為 1 到 4 個(gè)字節(jié):
U+ 0000 ~ U+ 007F: 0XXXXXXX
U+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXX
U+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXX
U+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
根據(jù)上表中的編碼規(guī)則,之前的「知」字的碼位 U+77E5 屬于第三行的范圍:
7 7 E 5
0111 0111 1110 0101 二進(jìn)制的 77E5
--------------------------
0111 011111 100101 二進(jìn)制的 77E5
1110XXXX 10XXXXXX 10XXXXXX 模版(上表第三行)
11100111 10011111 10100101 代入模版
E 7 9 F A 5
這就是將 U+77E5 按照 UTF-8 編碼為字節(jié)序列 E79FA5 的過(guò)程。反之亦然。