UTF-8和Unicode有什麼區別?

根據Wikipedia UTF-8頁面,我聽到人們的意見不一致。 python

他們是同一回事,不是嗎? 有人能夠澄清嗎? 安全


#1樓

Unicode是與ISO / IEC 10646一塊兒定義通用字符集(UCS)的標準, 通用字符集是表示幾乎全部已知語言所需的全部現有字符的超集。 學習

Unicode爲每一個字符集分配一個名稱和一個數字( 字符碼代碼點 )。 編碼

UTF-8編碼是一種在計算機內存中數字表示這些字符的方法。 UTF-8將每一個代碼點映射爲一系列八位字節(8位字節) spa

例如 設計

UCS字符= Unicode漢字字符 code

UCS代碼點= U + 24B62 orm

UTF-8編碼= F0 A4 AD A2(十六進制)= 11110000 10100100 10101101 10100010(bin) htm


#2樓

現有的答案已經解釋了不少細節,但這是一個簡短的答案,其中包含最直接的說明和示例。 排序

Unicode是將字符映射到代碼點的標準
每一個字符都有一個惟一的代碼點(標識號),這是一個數字,例如9731。

UTF-8是碼點的編碼
爲了將全部字符存儲在磁盤上(在文件中),UTF-8將字符分紅最多4個八位字節(8位序列)-字節。 UTF-8是幾種編碼(表示數據的方法)之一。 例如,在Unicode中,(十進制)代碼點9731表示一個雪人( ),它由UTF-8中的3個字節組成: E2 98 83

這是帶有一些隨機示例排序列表


#3樓

1. Unicode

世界各地有不少字符,例如「 $,&,h,a,t,?,張,1,=,+ ...」。

而後是一個致力於這些角色的組織,

他們制定了一個稱爲「 Unicode」的標準。

標準以下:

  • 建立一個窗體,其中每一個位置稱爲「代碼點」或「代碼位置」。
  • 整個位置從U + 0000到U + 10FFFF;
  • 到目前爲止,某些職位已填充字符,其餘職位已保存或爲空。
  • 例如,位置「 U + 0024」用字符「 $」填充。

PS:固然,還有另外一個名爲ISO的組織正在維護另外一個標準-「 ISO 10646」,幾乎相同。

2. UTF-8

如上所述,U + 0024只是一個位置,所以咱們沒法在計算機中爲字符「 $」保存「 U + 0024」。

必須有一種編碼方法。

而後是編碼方法,例如UTF-8,UTF-16,UTF-32,UCS-2 ....

在UTF-8下,代碼點「 U + 0024」被編碼爲00100100。

00100100是咱們在計算機中爲「 $」保存的值。


#4樓

讓我用一個例子來講明這個話題:

A chinese character:      漢
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001

到目前爲止,尚未什麼神奇的,這很簡單。 如今,假設咱們決定將此字符存儲在硬盤上。 爲此,咱們須要以二進制格式存儲字符。 咱們能夠直接將其存儲爲「 01101100 01001001」。 作完了!

可是請稍等,「 01101100 01001001」是一個字符仍是兩個字符? 您知道這是一個字符,由於我告訴過您,可是當計算機讀取它時,它就不知道了。 所以,咱們須要某種「編碼」來告訴計算機將其視爲一體。

這是「 UTF-8」規則出現的位置: http : //www.fileformat.info/info/unicode/utf8.htm

Binary format of bytes in sequence

1st Byte    2nd Byte    3rd Byte    4th Byte    Number of Free Bits   Maximum Expressible Unicode Value
0xxxxxxx                                                7             007F hex (127)
110xxxxx    10xxxxxx                                (5+6)=11          07FF hex (2047)
1110xxxx    10xxxxxx    10xxxxxx                  (4+6+6)=16          FFFF hex (65535)
11110xxx    10xxxxxx    10xxxxxx    10xxxxxx    (3+6+6+6)=21          10FFFF hex (1,114,111)

根據上表,若是咱們要使用'UTF-8'格式存儲此字符,則須要在咱們的字符前面加上一些'標題'。 咱們的漢字長16位(您本身計算二進制值),所以咱們將在第3行使用格式,由於它提供了足夠的空間:

Header  Place holder    Fill in our Binary   Result         
1110    xxxx            0110                 11100110
10      xxxxxx          110001               10110001
10      xxxxxx          001001               10001001

將結果寫成一行:

11100110 10110001 10001001

這是漢字的UTF-8(二進制)值! (請本身確認: http : //www.fileformat.info/info/unicode/char/6c49/index.htm

摘要

A chinese character:      漢
it's unicode value:       U+6C49
convert 6C49 to binary:   01101100 01001001
embed 6C49 as UTF-8:      11100110 10110001 10001001

PS:若是您想在python中學習此主題, 請單擊此處


#5樓

Unicode是一種普遍的標準,它定義了130,000個字符併爲每一個字符分配一個數字代碼(「代碼點」)。 它還定義了有關如何對該文本進行排序,對其進行規範化,更改其大小寫等的規則。 Unicode中的字符由從零到0x10FFFF(含零)的代碼點表示,儘管有些代碼點是保留的,不能用於字符。

Unicode中的代碼能夠用一種以上的編碼表示。 最簡單的是UTF-32,它簡單地將代碼點編碼爲32位整數,每一個整數爲4個字節寬。

UTF-8是另外一種編碼,並迅速成爲事實上的標準。 它編碼爲字節值序列。 每一個代碼點可使用可變數量的這些字節。 ASCII範圍內的代碼點被裸編碼,以與ASCII兼容。 超出此範圍的代碼點使用可變數量的字節(二、3或4),具體取決於它們位於的範圍。

UTF-8在設計時考慮瞭如下屬性:

  • ASCII字符的編碼方式與ASCII徹底相同,所以ASCII字符串也是有效的UTF-8字符串。

  • 二進制排序:使用樸素的二進制排序對UTF-8字符串進行排序仍將致使全部代碼點均按數字順序排序。

  • 須要多個字節的字符不包含ASCII範圍內的任何字節值,以確保它們的一部分不會被誤認爲ASCII字符。 這也是一項安全功能。

  • UTF-8易於驗證,而且能夠經過驗證器與其餘字符編碼區分開。 其餘8位或多字節編碼的文本也不多會驗證爲UTF-8。

  • 隨機訪問:在UTF-8字符串的任何點上,均可以判斷該位置的字節是不是字符的第一個字節,而且能夠回溯到該字符的開頭,而無需引用任何內容。字符串的開始。

相關文章
相關標籤/搜索