1. 程式人生 > 其它 >Unicode與UTF-8編碼

Unicode與UTF-8編碼

Unicode字符集

介紹

ascii編碼的字元有限,因此後續各個語言增加了對應的編碼字符集。比如GB2312主要針對漢語字元。

這些新增的字符集之間,一般並不相容,為了能夠同時使用不同語言下的字元,比如漢語和日語,設計出了Unicode字符集方案。

Unicode本身並不參與字元在計算機中的位元組表示,而是為幾乎所有字元統一設計一套編號,具有唯一性。

unicode表示範圍

Unicode編碼使用兩個位元組表示,包括集合所有常見字元,中文、日文、俄文等,以及數字運算字元、emoji表情包字元等。但是對於非常小眾的語言,存在遺漏是必然的。

unicode查詢:https://unicode-table.com/cn/blocks/

字元編碼表示

https://unicode-table.com/cn/4E2D/
https://c.runoob.com/front-end/3602/

中  U+4E2D \u4E2D

編碼的表示有兩種常用寫法,十六進位制加U+或者\u字首。

在某些程式語言的程式碼中(比如js),使用\u字首宣告這是一個unicode字元,編譯器將視其為一個字元進行處理。

UTF-8編碼

介紹

unicode字符集為字元設定了一個數字編號,但是並未告知具體如何用位元組表示。

因此又設計了UTF-8、UTF-16、UTF-32等編碼方案。最常用的是UTF-8。

參考:https://baike.baidu.com/item/UTF-8/481798

  • 使用1-4個位元組靈活編碼
    • 一個US-ASCIl字元只需1位元組編碼(Unicode範圍由U+0000~U+007F)。
    • 帶有變音符號的拉丁文、希臘文、西裡爾字母、亞美尼亞語、希伯來文、阿拉伯文、敘利亞文等字母則需要2位元組編碼(Unicode範圍由U+0080~U+07FF)。
    • 其他語言的字元(包括中日韓文字、東南亞文字、中東文字等)包含了大部分常用字,使用3位元組編碼。
    • 其他極少使用的語言字元使用4位元組編碼。
  • 相容ascii編碼,指的是ascii基礎碼0-127

編碼過程

參考:https://wenku.baidu.com/view/27494fcf9889680203d8ce2f0066f5335a8167a9.html

針對UTF8,編碼規則其實只有兩條:
1)單位元組規則: 對於 單位元組 的符號,位元組的第⼀位(最⾼位)設為 0,後⾯ 7 位為這個符號的 unicode 碼。
2)n位元組規則: 對於 n 位元組的符號(n>1),第⼀個位元組的前 n 位都設為 1,第 n+1 位設為 0,後⾯位元組的前兩位⼀律設為 10。剩下的沒有
提及的⼆進位制位,全部為這個符號的 unicode 碼。

UTF-8編碼中永遠不會存在位元組FF和FE

優缺點

優點是靈活編碼,佔用空間較少,尤其是處理英文字元較多的文字時。
缺點是無法根據字元數快速計算其佔用位元組多少,對於一個字元實際佔用的字元數無法直接確定,而需要實際解碼才知道。