你真的瞭解 Unicode 和 UTF-8 嗎?

引言web

歡迎工做一到八年的Java工程師朋友們加入Java高級交流:854630135windows

本羣提供免費的學習指導 架構資料 以及免費的解答架構

不懂得問題均可以在本羣提出來 以後還會有直播平臺和講師直接交流噢學習

一直以來老是對 unicode, UTF-8 等編碼知識懵懵懂懂的,尤爲是在作項目過程當中只要涉及到幾個編碼之間的轉換,都獲得網上搜索一番,根據別人的經驗照葫蘆畫瓢,才能解決問題,可是私底下卻徹底不懂在作什麼。編碼

我不再願意重複這種狀態了,因而就花了一個上午的時間,將這些知識整理了一遍。若是您以爲個人總結有疑問或者錯誤的地方,歡迎討論交流,批評指正。設計

正題以前,先引入我總結的 Unicode 思惟導圖來預熱下:3d

你真的瞭解 Unicode 和 UTF-8 嗎?

要了解 Unicode, 先要從 ASCII 碼提及。code

ASCII 碼
什麼是 ASCII 碼?orm

ASCII 碼(American Standard Code for Information Interchange)稱爲美國標準信息交換碼。它是基於拉丁字母的一套電腦編碼系統。它定義了一個用於表明常見字符的字典。blog

ASCII 碼都包含哪些字符?

包括 "A-Z"(大小寫都包含),數據"0-9" 以及一些常見的符號,要完整查看整個 ASCII 碼對應關係。

ASCII 碼的侷限在哪裏?

ASCII 當初只是爲美國英語而設計的,只能顯示 128 個編碼,對其餘的語言無能爲力。要想顯示其餘語言的編碼,仍是要使用 unicode。

Unicode
什麼是 Unicode ?

爲了將全世界的文字都統一的記錄下來,並將每一個字符都用惟一的數字記錄下來,因而就產生了Unicode。

Unicode 也稱爲 UCS(Universal Coded Character Set:國際編碼字符集合) 是一個字符集合,對世界上大部分的文字系統進行了整理,編碼,使電腦能夠用更爲簡單的方式來呈現和處理文字。最新的版本 Unicode 11.0 已經包含了 137439 個字符。

Unicode 的數量之多,若是徹底涵蓋它, 須要用 4 個字節來表示,可是計算機存儲過程當中卻不是必須都用 4 個字節來完成。對於有些字符,尤爲是編碼在前面的字符咱們也能夠經過 1 個或 兩個字節來節省空間。這就涉及到了 unicode 的實現方式。

Unicode 的實現方式有幾種?

Unicode 只是一個字符集合,每一個字符用一個數字來表示,可是這些數字在計算機內採用什麼方式來存儲,是所有都是 4 個字節,仍是 1 到 4 個字節不等,這就涉及到了字符編碼的概念。

咱們說 Unicode 有幾種實現方式,也就是在問 Unicode 有幾種編碼方式?

Unicode 經常使用的編碼方式有 UTF-8, UCS-2, UTF-16 三種,另外還有一種 UTF-32 雖然不太經常使用也須要提一下。

Unicode 的體系結構是什麼樣的?

Unicode 既然可以存儲那麼多的字符,確定是有它的存儲規則的,若是使用 16 進制存儲,它的存儲範圍是多少到多少,是否都是直筒式的,從低到高排就能夠了?也就是說 Unicode 的體系結構是怎麼樣的。

Unicode 當前定義其字符的存儲範圍是: 0hex 到 10FFFFhex ,共分爲 17 個區段,能夠存儲 1,114,112 個字符,這對當前 (137439) 來講遠遠足夠了。

其中區段爲 0hex 到 FFFFhex 稱爲 基本多文種平面 BMP (Basic Multilingual Plane),在這個平面中的字符表現形式是 U+ 後面跟 16 進制數。例如 X 字符的 unicode 是 U+0058。

而超出 BMP 範圍的,也就是 10000hex–10FFFFhex 這 16 個區段,須要用到 5 到 6 位來表示,如 U+E0001 和 U+10FFFD。

UTF-8 編碼

UTF-8 是使用互聯網上使用最普遍的 unicode 編碼方式,目前已經佔有整個互聯網 92% 的份額。這裏再強調下 UTF-8 只是 Unicode 的一種實現方式,UTF-8 是編碼方式,而 Unicode 是字符集合

它是可變長的編碼方式,長度從 1 個字節到 4 個字節不等。

它可以徹底兼容 ASCII 碼,咱們知道 ASCII 碼 是由 128 個字符組成的,而 Unicode 中的前 128 個字符和 ASCII 碼都是一一對應的。

UCS-2 編碼

UCS-2 只使用了兩個字節(16 bit) 來表示字符,也就是說只能表示 65536 個字符,它只能表示 BMP 中的字符。

當前的 unicode 字符數量已遠遠超過了 UCS-2 的數量,所以 UCS-2 雖然還在被好多軟件使用,但它已通過期了。

正由於 UCS-2 編碼依然被許多軟件使用,爲了可以表示出 BMP 之外的平面內的字符,就產生了一種新的編碼 UTF-16 編碼。

UTF-16 編碼

UTF-16 就是爲了解決 UCS-2 編碼的問題而生的,它擴展自 UCS-2

基本多文種平面中,與 UCS-2 編碼徹底一致,使用兩個字節表示
U+010000 到 U+10FFFF 範圍 使用 4 個字節表示
UTF-16 編碼的市場份額和 UTF-8 比很小, 在web 頁面中只佔 0.01% 。並且主要在 windows 系統中使用, Unix/Linux 以及 MacOS 中不多使用。

UTF-32 編碼

UTF-32 對 Unicode 中的每一個字符都用 4 個字節來表示,佔用的空間比其餘編碼要多的多,也正是這個緣由,人們才用的不多。

小結
既然看到了這裏,您必定對 unicode 有了一些認識吧,請再來回顧下 Unicode 的思惟導圖,加深下理解。

你真的瞭解 Unicode 和 UTF-8 嗎?

下面來總結下重點:

ASCII 碼只能表示 128 個字符,只是針對美國英語而設計的, 爲了表示其餘語言的字符,因而就有了 Unicode Unicode 只是一個字符集,裏面收集了全世界絕大部分語言的字符。它有多種實現方式(編碼方式),最經常使用的就是 UTF-8 UTF-8 編碼是變長字節的,1 到 4 個字節不等,而且它可以徹底兼容 ASCII 碼  

相關文章
相關標籤/搜索