Unicode->UTF-8歷史變遷,及其差異" />
0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從ASCII碼->Unicode-> UTF-8歷史變遷,及其差異

黃工的嵌入式技術(shù)圈 ? 來(lái)源:黃工的嵌入式技術(shù)圈 ? 作者:黃工的嵌入式技術(shù) ? 2020-02-27 15:56 ? 次閱讀

說(shuō)到ASCII,Unicode和UTF-8,可能大家都知道是字符編碼,但具體含義,以及其中差異,可能很多人都不知道。 一、名稱解釋ASCII:AmericanStandardCode forInformationInterchange,美國(guó)信息互換標(biāo)準(zhǔn)代碼。 Unicode:統(tǒng)一碼、萬(wàn)國(guó)碼、單一碼,是計(jì)算機(jī)科學(xué)領(lǐng)域里的一項(xiàng)業(yè)界標(biāo)準(zhǔn),包括字符集、編碼方案等。 UTF-8:8-bit Unicode Transformation Format,是一種針對(duì)Unicode的可變長(zhǎng)度字符編碼。 二、歷史變遷先給大家看一張變遷圖:

很久以前,有一群人,他們決定用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)?。他們看到這樣是好的,于是它們就這機(jī)器稱為”計(jì)算機(jī)“。 開(kāi)始計(jì)算機(jī)只在美國(guó)使用,八位的字節(jié)一共可以組合出256種不同的狀態(tài)。他們把其中的編號(hào)從0開(kāi)始的32種狀態(tài)分別規(guī)定了特殊的用途,一但終端、打印機(jī)遇上約定好的這些字節(jié)被傳過(guò)來(lái)時(shí),就要做一些約定的動(dòng)作。遇上0×10, 終端就換行,遇上0×07, 終端就向人們嘟嘟叫。他們看到這樣很好,于是就把這些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。 后來(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ò)展字符集”。 等中國(guó)人們得到計(jì)算機(jī)時(shí),已經(jīng)沒(méi)有可以利用的字節(jié)狀態(tài)來(lái)表示漢字,而且常用漢字有六七千個(gè),這個(gè)時(shí)候,中國(guó)人民就使用了一套漢字方案叫做GB2312”。隨著發(fā)展,又發(fā)現(xiàn)了一些局限,所以就有了GBK,再繼續(xù)往后增加了一些字符(如少數(shù)名族字體),GBK擴(kuò)成了GB18030。

因?yàn)楫?dāng)時(shí)各個(gè)國(guó)家都像中國(guó)這樣搞出一套自己的編碼標(biāo)準(zhǔn),結(jié)果互相之間誰(shuí)也不懂誰(shuí)的編碼,誰(shuí)也不支持別人的編碼,連大陸和***這樣只相隔了150海里也使用不同編碼。這個(gè)時(shí)候,出現(xiàn)了一個(gè)叫 ISO 組織(國(guó)際標(biāo)準(zhǔn)化組織)決定著手解決這個(gè)問(wèn)題。他們采用的方法很簡(jiǎn)單:廢了所有的地區(qū)性編碼方案,重新搞一個(gè)包括了地球上所有文化、所有字母和符號(hào) 的編碼!他們打算叫它“Universal Multiple-Octet Coded Character Set”,簡(jiǎn)稱 UCS, 俗稱 “Unicode”。

但是Unicode同樣也有2個(gè)問(wèn)題:

1.計(jì)算機(jī)怎么知道二個(gè)字節(jié)為一個(gè)字符,如何識(shí)別二個(gè)字節(jié)為什么一個(gè)字符?

2.針對(duì)英文字符,如果使用大于1個(gè)字節(jié)來(lái)表示,那么低位的前面幾個(gè)字節(jié)全是0。很奢侈浪費(fèi)空間,因?yàn)楝F(xiàn)在計(jì)算機(jī)大部分內(nèi)容還是英文。

unicode在很長(zhǎng)一段時(shí)間內(nèi)無(wú)法推廣,直到互聯(lián)網(wǎng)的出現(xiàn),為解決unicode如何在網(wǎng)絡(luò)上傳輸?shù)膯?wèn)題,于是面向傳輸?shù)谋姸郩TF(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ó)界,這樣就可以顯示全世界上所有文化的字符了。 三、Charset and Encoding

1.什么是字符編碼Charset (Character set) 字符集:是對(duì)字符抽象表示的集合。包括世界上各種文字、符合和字符。 字符集只是一個(gè)規(guī)則集合的名字,對(duì)應(yīng)到真實(shí)生活中,字符集就是對(duì)某種語(yǔ)言的稱呼。例如:英語(yǔ),漢語(yǔ),日語(yǔ)。 2.什么是字符編碼對(duì)于一個(gè)字符集來(lái)說(shuō)要正確編碼轉(zhuǎn)碼一個(gè)字符需要三個(gè)關(guān)鍵元素:字庫(kù)表(character repertoire)、編碼字符集(coded character set)、字符編碼(character encoding)。

字庫(kù)表是一個(gè)相當(dāng)于所有可讀或者可顯示字符的數(shù)據(jù)庫(kù)。字庫(kù)表決定了整個(gè)字符集能夠展現(xiàn)表示的所有字符的范圍。編碼字符集,即用一個(gè)編碼值code point來(lái)表示一個(gè)字符在字庫(kù)中的位置。字符編碼,將編碼字符集和實(shí)際存儲(chǔ)數(shù)值之間的轉(zhuǎn)換關(guān)系。 四、UTF-8和Unicode的關(guān)系看完上面兩個(gè)概念解釋,相信你應(yīng)該明白其中關(guān)系了。Unicode就是上文中提到的編碼字符集,而UTF-8就是字符編碼,即Unicode規(guī)則字庫(kù)的一種實(shí)現(xiàn)形式。隨著互聯(lián)網(wǎng)的發(fā)展,對(duì)同一字庫(kù)集的要求越來(lái)越迫切,Unicode標(biāo)準(zhǔn)也就自然而然的出現(xiàn)。它幾乎涵蓋了各個(gè)國(guó)家語(yǔ)言可能出現(xiàn)的符號(hào)和文字,并將為他們編號(hào)。

五、進(jìn)一步理解UTF-8編碼UTF-8編碼為變長(zhǎng)編碼。最小編碼單位(code unit)為一個(gè)字節(jié)。一個(gè)字節(jié)的前1-3個(gè)bit為描述性部分,后面為實(shí)際序號(hào)部分。

1.如果一個(gè)字節(jié)的第一位為0,那么代表當(dāng)前字符為單字節(jié)字符,占用一個(gè)字節(jié)的空間。0之后的所有部分(7個(gè)bit)代表在Unicode中的序號(hào)。

2.如果一個(gè)字節(jié)以110開(kāi)頭,那么代表當(dāng)前字符為雙字節(jié)字符,占用2個(gè)字節(jié)的空間。110之后的所有部分(5個(gè)bit)加上后一個(gè)字節(jié)的除10外的部分(6個(gè)bit)代表在Unicode中的序號(hào)。且第二個(gè)字節(jié)以10開(kāi)頭。

3.如果一個(gè)字節(jié)以1110開(kāi)頭,那么代表當(dāng)前字符為三字節(jié)字符,占用3個(gè)字節(jié)的空間。110之后的所有部分(5個(gè)bit)加上后兩個(gè)字節(jié)的除10外的部分(12個(gè)bit)代表在Unicode中的序號(hào)。且第二、第三個(gè)字節(jié)以10開(kāi)頭。

來(lái)看一個(gè)UTF-8編碼例子:

發(fā)現(xiàn)其中規(guī)律:1個(gè)字節(jié)的UTF-8十六進(jìn)制編碼是以比8小的數(shù)字開(kāi)頭的 2個(gè)字節(jié)的UTF-8十六進(jìn)制編碼是以C或D開(kāi)頭的 3個(gè)字節(jié)的UTF-8十六進(jìn)制編碼是以E開(kāi)頭的 本文就寫(xiě)到這里,希望對(duì)你有幫助。當(dāng)然,更多關(guān)于字符編碼的內(nèi)容,感興趣朋友可以自行了解。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • ASCII
    +關(guān)注

    關(guān)注

    5

    文章

    171

    瀏覽量

    34993
  • Unicode
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    12542
  • UTF-8
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    7837
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    請(qǐng)問(wèn)afe_handle->fetch獲得的音頻數(shù)據(jù)如何播放?

    目前我在基于ESP-SkaiNet的sample,開(kāi)發(fā)語(yǔ)音助手。當(dāng)提示詞喚醒后對(duì)用戶輸入的 語(yǔ)音保存和處理。 我想請(qǐng)教一下,當(dāng)我通過(guò)afe_handle->fetch
    發(fā)表于 07-19 07:53

    sem信號(hào)量下semxx->parent.suspend_thread->next的值,應(yīng)該執(zhí)行take線程的被改變成了release線程,為什么?

    的某個(gè)時(shí)候,sem信號(hào)量下的semxx->parent.suspend_thread->next的值發(fā)生了改變,本來(lái)應(yīng)該指向take線程的地址,變成了指向r
    發(fā)表于 07-12 14:36

    運(yùn)行usb/device /usb_webcam報(bào)錯(cuò)no versions of leeebo/tinyusb_src match >=0.15.0~6的原因?

    ;gt;=0.0.0,<0.1.0 || >0.1.0,<1.0.0 and usb_devic
    發(fā)表于 06-27 06:44

    ESP32S2使用VSCODE編譯,總是會(huì)調(diào)用build->bootLoader->config->sdkconfig.h文件為什么?

    ESP32S2使用VSCODE編譯,在調(diào)用sdkconfig.h頭文件時(shí),總是會(huì)調(diào)用 build->bootLoader->config-&
    發(fā)表于 06-07 06:48

    如果>=2 傳感器與GND短路,CY8CMBR3108無(wú)法啟動(dòng)怎么解決?

    。 2) 然而,如果>2 焊盤(pán)在上電時(shí)與 GND 短路,CY8CMBR3108 將拒絕任何與之交易的嘗試,并且似乎無(wú)法正常啟動(dòng)。 它永遠(yuǎn)處于這種狀態(tài),直到我消除足夠多的短路,使得只有
    發(fā)表于 05-31 14:27

    在官方庫(kù)中發(fā)現(xiàn)GPIOx->ODR這種寫(xiě)法,是什么意思,怎么中間會(huì)有->?

    本人新手,剛接觸st的芯片 在官方庫(kù)中發(fā)現(xiàn)GPIOx->ODR這種寫(xiě)法,不知道這是什么意思,怎么中間會(huì)有->? 請(qǐng)論壇上高手予以幫忙解答
    發(fā)表于 05-10 06:48

    IAR for STM8工程->option選項(xiàng)中ST-Link各個(gè)選項(xiàng)是什么意思?

    this option will first erase the whole Flash Memory. 這是什么問(wèn)題? 工程->option 選項(xiàng)中ST-Link各個(gè)選項(xiàng)是什么意思?
    發(fā)表于 04-28 06:57

    tftlcd畫(huà)線程序里面xerr>distance和yerr>distance兩個(gè)條件能成立嗎?

    實(shí)驗(yàn)中這個(gè)程序是沒(méi)問(wèn)題的,就是在個(gè)人讀程序中,無(wú)法理解if(xerr>distance) 和if(yerr>distance) 兩個(gè)條件,個(gè)人認(rèn)為dista
    發(fā)表于 04-22 07:35

    while((GPIOD->IDR & 0x0400)!=0x0400);在PD10=1時(shí)執(zhí)行需要多長(zhǎng)時(shí)間?

    while((GPIOD->IDR0x0400)!=0x0400);在PD10=1時(shí)執(zhí)行需要多長(zhǎng)時(shí)間,使用的是STM32F103,外部8M晶振倍頻到72M
    發(fā)表于 04-22 07:33

    用CubeMx創(chuàng)建了Freertos,工程Middlewares->Tgird_Party->FreeRTOS ->Souce下面只有幾個(gè)空文件夾為什么?

    我用CubeMx創(chuàng)建了Freertos,發(fā)現(xiàn)在工程的Middlewares->Tgird_Party->FreeRTOS -&
    發(fā)表于 03-28 06:20

    怎么將pMCI[M1]->pSTM->bState 的 IDLE_START傳遞給STM[M1]->bState的?

    ] );// STM[M1]->bState switch ( StateM1 ) { case IDLE_START: 看了很多遍都沒(méi)發(fā)現(xiàn)是怎么將 pMCI[M1]-&
    發(fā)表于 03-27 07:56

    Open RAN的未來(lái)及其對(duì)AT&T的意義

    3月14日消息,在“Connected America 2024”會(huì)議上,AT&T高級(jí)副總裁兼網(wǎng)絡(luò)首席技術(shù)官Yigal Elbaz討論了Open RAN 的未來(lái)及其對(duì)AT&T的意義。
    的頭像 發(fā)表于 03-14 14:40 ?597次閱讀

    采用UTF8UTF16都無(wú)法使用中文SSID怎么解決?

    采用 UTF8UTF16都無(wú)法使用中文SSID 將wifi ssid設(shè)置為 \" test12 \",分別用了以下 3種 unicode編解碼格格式,測(cè)試情況分分如下: 1.格式一:UT
    發(fā)表于 02-29 06:36

    ascii值怎么計(jì)算 ascii怎么換算

    ASCII(American Standard Code for Information Interchange)是一種用于表示字符的編碼系統(tǒng),每個(gè)字符都被賦予一個(gè)唯一的7位二進(jìn)制數(shù)值。ASCII
    的頭像 發(fā)表于 01-25 10:30 ?1.2w次閱讀

    單片機(jī)也可以輕松玩轉(zhuǎn)UTF-8和TTF字體了

    要讓智能設(shè)備支持各國(guó)不同的文字,首先得有支持全球文字的編碼集,時(shí)下最出名的要數(shù)UTF-8了。
    的頭像 發(fā)表于 11-23 17:18 ?3789次閱讀
    單片機(jī)也可以輕松玩轉(zhuǎn)<b class='flag-5'>UTF-8</b><b class='flag-5'>碼</b>和TTF字體了