Unicode 與 UTF 8的關係

2021-07-29 20:05:50 字數 3320 閱讀 8195

要弄清unicode與utf-8的關係,我們還得從他們的**說起,下來我們從剛開始的編碼說起,直到utf-8的出現,我們就會感覺到他們之間的關係

1、ascii碼

我們都知道,在計算機的世界裡,資訊的表示方式只有0和1,但是我們人類資訊表示的方式卻與之大不相同,很多時候是用語言文字、影象、聲音等傳遞資訊的,那麼我們怎樣將其轉化為二進位制儲存到計算機中,這個過程我們稱之為編碼,其實就是一種人為的規定。

我們知道乙個二進位制有兩種狀態:」0」 狀態 和 「1」狀態,這麼乙個二進位制,我們稱之為 「一位」,比如我寫個1,就代表乙個二進位制位,寫個1000 0000 就代表八個二進位制位,那麼我們可以發現,乙個二進位制可以有兩種狀態,那麼它就可以代表兩種不同的東西,我們想賦予它什麼含義,就賦予什麼含義,比如說我規定,「0」 代表 「吃過了」, 「1」代表 「還沒吃」,這樣,我們就相當於把現實生活中的資訊編碼成二進位制數字了,並且這個例子中是一位二進位制數字,那麼2位二進位制數可以代表多少種情況能?對,是四種,2*2,分別是 00、01、10、11,那7種呢?答案是2^7=128,我們知道,在計算機中每八個二進位制位組成了乙個位元組(byte),計算機儲存的最小單位就是位元組,位元組如下圖所示

所以早期人們用8位二進位制來編碼英文本母(最前面的一位是0),也就是說,將英文本母和一些常用的字元和這128中二進位制0、1串一一對應起來,比如說 大寫字母「a」所對應的二進位制位「01000001」轉換為十六進製制為41

在美國,這128是夠了,但是其他國家不答應啊,他們的字元和英文是有出入的,比如在法語中在字母上有注音符號,如é,這個怎麼表示成二進位制,所以各個國家就決定把位元組中最前面未使用的那乙個位拿來使用,原來的128種狀態就變成了256種狀態,比如é就被編碼成130(二進位制的10000010),為了保持與ascii碼的相容性,一般最高為為0時和原來的ascii碼相同,最高位為1的時候,各個國家自己給後面的的數字(最高為為1,也就是128以後)賦予他們國家的字元意義,但是這樣一來又有問題出現了,不同國家對新增的128個數字賦予了不同的含義,比如說130在法語中代表了é,但是在希伯來語中卻代表了字母gimel(這不是希伯來字母,只是讀音翻譯成英文的形式)具體的希伯來字母gimel看下圖

所以這就成了不同國家有不同國家的編碼方式(前128個狀態所代表的含義是一樣的),所以如果給你一串二進位制數,你想要解碼,就必須知道它的編碼方式,不然就會出現我們有時候看到的亂碼

2.unicode的出現

unicode為世界上所有字元都分配了乙個唯一的數字編號,這個編號範圍從 0x000000 到 0x10ffff(十六進製制),有110多萬,每個字元都有乙個唯一的unicode編號,這個編號一般寫成16進製制,在前面加上u+。例如:「馬」的unicode是u+9a6c.

unicode就相當於一張表,建立了字元與編號之間的聯絡

它是一種規定。但是它沒有規定這個編號怎麼對應到二進位制表示,unicode本身只規定了每個字元的數字編號是多少。有的人會說了,那我可以直接把unicode編號直接轉換成二進位制啊,是的,你可以,但是這個就需要人為的規定了,而unicode並沒有說這樣弄,因為除了你這種直接轉換成二進位制的方案外,還有其他方案,接下來我們會逐一看到。

編號怎麼對應到二進位制表示呢?有多種方案:主要有utf-8,utf-16,utf-32

1、utf-32

先來看簡單的utf-32

這個就是字元所對應編號的整數二進位制形式,四個位元組。這個就是直接轉換。

這裡需要說明的是,轉換成二進位制後計算機儲存的問題,我們知道,計算機在儲存器中排列位元組有兩種方式:大端法和小端法,大端法就是所要表示的數的高位在低位址處,小端法相反,大端法儲存0x01234567如下

所以我們在編碼方式中有utf-32be和utf-32le,分別對應大端和小端,讓編輯器直接通知作業系統用使用者指定的大小端去儲存資料

2、utf-16

utf-16使用變長位元組表示

① 對於編號在u+0000到u+ffff的字元(常用字符集),直接用兩個位元組表示。

② 編號在 u+10000到10ffff之間的字元,需要用四個位元組表示,前兩個位元組叫高**項,範圍是u+dc00到u+dfff。

如何區別在utf-16中我是用兩個位元組來代表還是四個位元組來代表我的字元,其實很簡單,我只看前兩個位元組的編號範圍,如果是u+d800到u+dbff,就是四個位元組,否則兩個位元組

3、utf-8

utf-8就是使用變長位元組表示,顧名思義,就是使用的位元組數可變,這個變化是根據unicode編號的大小有關,編號小的使用的位元組就少,編號大的使用的位元組就多。使用的位元組個數從1到4個不等。

utf-8的編碼規則是:

① 對於單位元組的符號,位元組的第一位設為0,後面的7位為這個符號的unicode碼,因此對於英文本母,utf-8編碼和ascii碼是相同的

② 對於n位元組的符號(n>1),第乙個位元組的前n位都設為1,第n+1位設為0,後面位元組的前兩位一律設為10,剩下的沒有提及的二進位制位,全部為這個符號的unicode碼

舉個例子:比如說乙個字元的unicode編碼是130,顯然按照utf-8的規則乙個位元組是表示不了它(因為如果是乙個位元組的話前面的一位必須是0),所以需要兩個位元組,所以它的格式為110***xx 10******

下面我們來具體看看具體的unicode編號範圍與對應的utf-8二進位制格式

那麼對於乙個具體的unicode編號,具體怎麼進行utf-8的編碼呢?

首先將其看做整數,轉化為二進位制形式(去掉高位的0),然後對照上面的表,看這個二進位制長度符合哪乙個編號範圍所對應的二進位制格式的長度(除去紅色部分的),然後從右向左依次填入,如果還有x未填,則設為0

比如:「馬」的unicode編號是:0x9a6c,整數編號是39532,對應的二進位制是1001 1010 0110 1010,長度為16,剛好符合第三個範圍,其格式為:1110***x 10****** 10******,將二進位制填入進入就為:

11101001 10101001 10101100

總結:utf-8、utf-16、utf-32都是unicode的一種實現,因為unicode並沒有指定以哪種方式去吧編號轉化為二進位制,而這三種把unicode編號對應到了二進位制形式,只是對應方法不同而已

unicode和utf8的關係

很久以前儲存的,別人寫的但是很明了 很久很久以前,有一群人,他們決定用8個可以開合的電晶體來組合成不同的狀態,以表示世界上的萬物。他們看到8個開關狀態是好的,於是他們把這稱為 位元組 再後來,他們又做了一些可以處理這些位元組的機器,機器開動了,可以用位元組來組合出很多狀態,狀態開始變來變去。他們看到...

Unicode和UTF 8的關係

今天下午,我突然想搞清楚unicode和utf 8之間的關係,於是就開始在網上查資料。結果,這個問題比我想象的複雜,從午飯後一直看到晚上8 30點,才算初步搞清楚。下面就是我的筆記,主要用來整理自己的思路。但是,我盡量試圖寫得通俗易懂,希望能對其他朋友有用。畢竟,字元編碼是計算機技術的基石,想要熟練...

UTF8與Unicode的轉換

如果unicode字元由2個位元組表示,則編碼成utf 8很可能需要3個位元組,而如果unicode字元由4個位元組表示,則編碼成utf 8可能需要6個位元組。用4個或6個位元組去編碼乙個unicode字元可能太多了,但很少會遇到那樣的unicode字元。utf 8轉換表表示如下 unicodeut...