根據Wikipedia UTF-8頁面,我聽到人們的意見不一致。 python
他們是同一回事,不是嗎? 有人能夠澄清嗎? 安全
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
現有的答案已經解釋了不少細節,但這是一個簡短的答案,其中包含最直接的說明和示例。 排序
Unicode是將字符映射到代碼點的標準 。
每一個字符都有一個惟一的代碼點(標識號),這是一個數字,例如9731。
UTF-8是碼點的編碼 。
爲了將全部字符存儲在磁盤上(在文件中),UTF-8將字符分紅最多4個八位字節(8位序列)-字節。 UTF-8是幾種編碼(表示數據的方法)之一。 例如,在Unicode中,(十進制)代碼點9731表示一個雪人( ☃
),它由UTF-8中的3個字節組成: E2 98 83
世界各地有不少字符,例如「 $,&,h,a,t,?,張,1,=,+ ...」。
而後是一個致力於這些角色的組織,
他們制定了一個稱爲「 Unicode」的標準。
標準以下:
PS:固然,還有另外一個名爲ISO的組織正在維護另外一個標準-「 ISO 10646」,幾乎相同。
如上所述,U + 0024只是一個位置,所以咱們沒法在計算機中爲字符「 $」保存「 U + 0024」。
必須有一種編碼方法。
而後是編碼方法,例如UTF-8,UTF-16,UTF-32,UCS-2 ....
在UTF-8下,代碼點「 U + 0024」被編碼爲00100100。
00100100是咱們在計算機中爲「 $」保存的值。
讓我用一個例子來講明這個話題:
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中學習此主題, 請單擊此處
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字符串的任何點上,均可以判斷該位置的字節是不是字符的第一個字節,而且能夠回溯到該字符的開頭,而無需引用任何內容。字符串的開始。