簡單聊下Unicode和UTF 8

2021-09-06 19:43:51 字數 1802 閱讀 6284

今晚聽同事分享提到這個,簡單總結下。

## unicode字符集

unicode的出現是因為ascii等其他編碼碼不夠用了,比如ascii是英語為母語的人發明的,只要乙個位元組8位就能夠表示26個英文本母了,但是當跨區域進行資訊交流的時候,尤其是internet的出現,除了「a」,「b」,「c",還有「你」,「我」,「他」需要表示,乙個位元組8位顯然不夠用,因此unicode就被發明出來,unicode的最大碼位0x10ffff,有21位。中文對應的unicode編碼見

## utf-8字元編碼

unicode只是給這世界上每個字元規定了乙個統一的二進位制編號,並沒有規定程式該如何去儲存和解析。

可以說utf-8是unicode實現方式之一,它的規則如下:

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

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

unicode編碼(十六進製制)

utf-8 位元組流(二進位制)

000000 - 00007f

0******x

000080 - 0007ff

110***xx 10******

000800 - 00ffff

1110***x 10****** 10******

010000 - 10ffff

11110*** 10****** 10****** 10******

可以看到最多一共有21個x,所以剛好能夠表示unicode的最大的碼位。

##大端(be)和小端(le)

考慮4個位元組的16進製表示ox12345678,計算機都是以位元組為單位儲存資料的,因此記憶體位址空間從低到高被挖成乙個個「坑」,乙個蘿蔔乙個坑,那麼相鄰的蘿蔔之間自然就有順序的問題。文字說明太抽象,直接看圖理解。

大端跟我們平時的書寫習慣一致,比較好理解,記住大端就可以了,我們平時說的網路位元組順序也是指大端,至於小端就讓它見鬼去吧。

實在要文字說明理解的話,可以這麼來:大端可以認為是「高位在尾端」(大->高),「高位」指的是我們書寫時的高位,比如1024,個十百千,1是高位,「尾端」指的是記憶體空間中低位址一端,所以1儲存在低位址空間,只不過計算機是以乙個位元組為單位的。反之小端就是「低位在尾端」(小->低)了。

## bom

bom(byte order mark)是用來區分位元組序列和編碼方式的(utf-8,utf-16,utf-32)。就是讓編輯器或程式讀到前面幾個位元組就知道後面該以哪種編碼方式來解析,8/16/32是指以多少位作為編碼單位的,依次就是1/2/4個位元組,因為utf-8是以單個位元組作為編碼單位的所以其實沒有必要指定它的位元組序列,所以utf-8有bom和無bom的兩種。

utf編碼

byte order mark (bom)

utf-8 without bom

無utf-8 with bom

ef bb bf

utf-16le

ff fe

utf-16be

fe ff

utf-32le

ff fe 00 00

utf-32be

00 00 fe ff

## 延伸閱讀

unicode字元平面對映:

[1]:

python中編碼unicode和utf 8

在python中的字串記憶體中是用unicode進行編碼 python2 s 我愛你python su u 我愛你python s.encode utf 8 traceback most recent call last file line 1,in unicodedecodeerror ascii...

關於unicode和utf8,utf16等

經常有人談起 我如何把gb或unicode字串轉化成utf8字串?這類的問題 這裡按照自己的理解簡要說明一下 unicode是字元編碼的乙個標準,這個和gb2312或者bg5等是對應的,但是unicode又有些比較高階的特殊性,unicode的編碼是固定的,但是表示這個編碼的形式是多種多樣的,比如乙...

簡單的理解unicode和utf 8的關係

目前,做了個簡單的爬蟲程式,爬取到utf 8的頁面中竟然存在著混合了unicode的編碼字串的字串 例如 u1234中文 先說說如何將unicode的編碼字串轉換成相應的編碼物件 就想著用正則先將unicode過濾出來 正則式是 u 0 9,a f 然後取出 u x 後面四位編碼 例如 u65e0 ...