1. 程式人生 > >Unicode和UTF-8之間的關系

Unicode和UTF-8之間的關系

總結 ant color ron ont OS 字符 英語字母 port

https://blog.csdn.net/xiaolei1021/article/details/52093706

Unicode,又稱萬國碼,規定了符號與二進制碼的對應關系,沒有規定二進制碼的保存方式。

假如,‘a’的Unicode碼為0x0d12,‘b’的unicode碼為0x23d4;給0x od12 23d4,並不能夠解讀為

‘ab’,因為0x od12 23d4 在unicode碼表中表示為另一個符號。

那麽,我們就要規定unicode的二進制嗎的存儲方式,UTF-8就是在互聯網上使用最廣的一種Unicode的實現方式。

utf-8是一種 變長的 編碼方式,為了節約內存資源,英文數字采用1字節保存(兼容ascii編碼),中文一般 3字節保存。

UTF-8的編碼規則很簡單,只有二條:

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

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

下表總結了編碼規則,字母x表示可用編碼的位。

Unicode符號範圍 | UTF-8編碼方式
(十六進制) | (二進制)
--------------------+---------------------------------------------
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

跟據上表,解讀UTF-8編碼非常簡單。如果一個字節的第一位是0,則這個字節單獨就是一個字符;如果第一位是1,則連續有多少個1,就表示當前字符占用多少個字節。

下面,還是以漢字"嚴"為例,演示如何實現UTF-8編碼。

已知"嚴"的unicode是4E25(100111000100101),根據上表,可以發現4E25處在第三行的範圍內(0000 0800-0000 FFFF),因此"嚴"的UTF-8編碼需要三個字節,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然後,從"嚴"的最後一個二進制位開始,依次從後向前填入格式中的x,多出的位補0。這樣就得到了,"嚴"的UTF-8編碼是"11100100 10111000 10100101",轉換成十六進制就是E4B8A5。

Unicode和UTF-8之間的關系