摘要:概念是一種針對的可變長度字符編碼,又稱萬國碼。通過上面的介紹我們可以知道,是一種非常通用的可變長字符編碼方式。概念是字符編碼五層次模型的第三層字符編碼表,也稱為的一種實現方式。
概述
本文通過介紹Unicode編碼以及對應的兩種編碼方式UTF-8和UTF-16,讓讀者能夠了解關于字符串編碼的相關知識,同時能夠弄清楚Unicode和UTF-8和UTF-16之間的關系。
本文的主要內容為:
Unicode編碼,包含Unicode編碼基礎知識以及與UTF-8和UTF-16這兩種編碼方式的關系
UTF-8編碼,包含基礎概念和Unicode編碼轉換到UTF-8編碼方式
UTF-16編碼,包含基礎概念和Unicode編碼轉換到UTF-16編碼方式
JavaScript中string與DOMString
本文作為utfx.js源碼解析的基礎知識儲備文章,通過了解UTF-8和UTF-16這兩種編碼方式,讀者能夠理解使用JavaScript進行編碼轉換的原理。
如果想了解編碼轉換的使用場景,可以閱讀我之前的博客WebSocket系列之JavaScript字符串如何與二進制數據間進行互相轉換。
如果想了解utfx.js相關的源碼內容,可以關注我的后續文章。
Unicode編碼 概念Unicode(統一碼、萬國碼、單一碼)是計算機科學領域里的一項業界標準,包括字符集、編碼方案等。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一并且唯一的二進制編碼,以滿足跨語言、跨平臺進行文本轉換、處理的要求。1990年開始研發,1994年正式公布。
通常Unicode編碼是通過2 Byte來表示一個字符的,如U+A12B,2 Byte的二進制表示方法結果就是1010(A)0001(1) 0010(2)1011(B)。
簡單介紹完了Unicode,我們來看下UTF-8和UTF-16。需要注意的是:UTF是Unicode TransferFormat的縮寫,UTF-8和UTF-16都是把Unicode碼轉換成程序數據的一種編碼方式。
UTF-8 概念UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字符編碼,又稱萬國碼。由Ken Thompson于1992年創建。現在已經標準化為RFC 3629。UTF-8用1到6個字節編碼Unicode字符。用在網頁上可以統一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。
通過上面的介紹我們可以知道,UTF-8是一種非常通用的可變長字符編碼方式。
首先,我們來介紹下什么叫做可變長編碼?可變長編碼就是指在針對某個字符進行編碼時,他的表示長度是不固定的。像UTF-8里面,ASCII所表示的字符集就是用1 Byte來表示,而大部分漢字則是用3 Byte來表示。
相較于Unicode統一使用2 Byte來表示字符,在遇到大部分字符都可以用1 Byte表示時,能夠節省許多存儲空間。但是,如果遇到需要用超過2 Byte來表示的字符,那么UTF-8的編碼方式則會消耗更多的存儲空間。
表示方式通過上面的介紹我們可以知道,不同的Unicode碼在UTF-8中占用了不同的存儲空間。下面我們就通過一個表格來看下將Unicode字符轉換為UTF-8編碼方式的具體步驟。其中的?表示轉換成UTF-8編碼后,Unicode碼占用的二進制位置。
Unicode碼范圍 | UTF-8編碼方式 |
---|---|
U+0000~U+007F | 0???????? |
U+0080~U+07FF | 110????? 10?????? |
U+0800~U+FFFF | 1110???? 10?????? 10?????? |
U+10000~U+10FFFF | 11110??? 10?????? 10?????? 10?????? |
當我們得到Unicode碼后,我們先根據上面的這個表判斷其所處的范圍,然后將Unicode碼轉換為二進制表示,從后往前截取UTF-8編碼中所留為之長度,從前往后依次填入對應位置,所即可得到UTF-8的編碼。我們舉兩個例子來看下:
U+0020,這個字符的小于0000 007F,所以只需要用1 Byte來進行編碼。U+0020的二進制表示為0000(0)0000(0) 0010(2)0000(0),那么從后往前截取7位得到010 0000,放入UTF-8編碼方式中,得到的結果為00101111,轉換為十六進制得到2F。因此存儲在內存中的的順序就是2F。
U+A12B,這個字符大于0000 0800,小于0000 FFFF,因此需要用3 Byte來進行編碼。U+A12B的二進制表示為1010(A)0001(1) 0010(2)1011(B)。,那么從后往前截取16位得到10100001 00101011(Unicode碼本身),放入UTF-8編碼中,得到的結果為11101010 10000100 10101011,轉換十六進制得到EA84AB。因此,存儲在內存中的順序就是EA 84 AB。
通過上面的例子,我相信大家對UTF-8的編碼有了一個深入的理解。下面,讓我們來看下另一種編碼方式——UTF-16。
UTF-16 概念UTF-16是Unicode字符編碼五層次模型的第三層:字符編碼表(Character Encoding Form,也稱為 "storage format")的一種實現方式。即把Unicode字符集的抽象碼位映射為16位長的整數(即碼元, 長度為2 Byte)的序列,用于數據存儲或傳遞。Unicode字符的碼位,需要1個或者2個16位長的碼元來表示,因此這是一個變長表示。
引用維基百科中對于UTF-16編碼的解釋我們可以知道,UTF-16最少也會用2 Byte來表示一個字符,因此沒有辦法兼容ASCII編碼(ASCII編碼使用1 Byte來進行存儲)。
表示方式在UTF-16中,我們將Unicode分為了兩個范圍,分別通過不同的方式進行存儲。具體表示見下圖。
Unicode范圍 | UTF-16編碼方式 |
---|---|
U+000~U+FFFF | 2 Byte存儲,編碼后等于Unicode值 |
U+10000~U+10FFFF | 4 Byte存儲,現將Unicode值減去(0x10000),得到20bit長的值。再將Unicode分為高10位和低10位。UTF-16編碼的高位是2 Byte,高10位Unicode范圍為0-0x3FF,將Unicode值加上0XD800,得到高位代理(或稱為前導代理,存儲高位);低位也是2 Byte,低十位Unicode范圍一樣為0~0x3FF,將Unicode值加上0xDC00,得到低位代理(或稱為后尾代理,存儲低位) |
根據上面的轉換方式,我們就能夠將Unicode碼根據UTF-16的編碼方式進行轉換。下面我們仍然通過兩個例子來看下:
U+0020,這個值的范圍在第一部分,即經過UTF-16編碼后,結果仍然為U+0020,在內存中的順序為00 20。
U+12345, 這個值的范圍在第二部分,因此需要先減去0x10000,得到0x02345,拆分成高10位00 0000 1000和低10位11 0100 0101。根據上面規則加上特定值后,高位代理值為D808,低位代理值為DF45,最終內存中的順序為D8 08 DF 45。
JavaScript中的string與DOMString在JavaScript中,所有的string類型(或者被稱為DOMString)都是使用UTF-16編碼的。
因此,當我們需要轉換成二進制與后端進行通信時,需要注意相關的編碼方式。
總結本文通過對Unicode編碼和UTF-8和UTF-16兩種編碼方式進行介紹,讓大家了解Unicode編碼以及相關的兩種程序數據編碼方式。
本文是作為utfx.js源碼分析的基礎知識儲備文章,在稍后的時間將會給大家帶來相關內容的后續文章——utfx.js源碼解析,讓大家能夠了解在JavaScript中如何進行相關的編碼轉換。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94165.html
摘要:編碼轉換為編碼下面讓我們來看下如何將編碼的數據轉換為編碼的數據。該方法是將碼進行編碼轉換,從而得到編碼的數據。 概述 當你在前端需要通過二進制數據與服務端進行通信時,你可能會遇到二進制數據的編碼問題。大部分服務端的字符串編碼類型都為UTF-8,而JavaScript中字符串編碼類型是UTF-16,因此,你需要一個能夠將字符串在兩種編碼方式間進行轉換的方法。 本文通過對utfx.js這個...
摘要:本文大部分內容轉自阮一峰前輩的文章,更新了部分內容并加入了部分自己的理解。字符串處理函數新增了幾個專門處理字節碼點的函數。參考鏈接阮一峰與詳解輔助平面入門 本文大部分內容轉自 阮一峰前輩的文章,更新了部分內容并加入了部分自己的理解。 Unicode是什么? Unicode源于一個很簡單的想法:將全世界所有的字符包含在一個集合里,計算機只要支持這一個字符集,就能顯示所有的字符,再也不會有...
摘要:下文件名長度限制出現場景在迭代中有一個需求是將文件名修改為所有班級的名稱集合,出現的班級過多導致的文件名過長在下無法創建文件和文件夾的情況解決方式經過查證,中文件名最長為字符,文件路徑最大長度為字符。這是被編碼方案決定的,通過來指定。 Linux下文件名長度限制 出現場景:在迭代中有一個需求是將pdf文件名修改為所有班級的名稱集合,出現的班級過多導致的文件名過長在linux下無法創建文...
摘要:其他編碼的可以參考,,的選擇不考慮隨機訪問,,查找第個字符時間復雜度隨機訪問,只用之內的字符,,時間復雜度隨機訪問,超過了,詳解編碼 1.字符集vs字符編碼,編碼&解碼 Character----->code point----->bytes 前兩者字符集的關系,可以統稱為codepoint;從codepoint到在計算機上的存儲形式,稱為編碼,反過來稱為解碼; 字符集:單個符號(ch...
閱讀 1496·2023-04-26 01:28
閱讀 3315·2021-11-22 13:53
閱讀 1420·2021-09-04 16:40
閱讀 3189·2019-08-30 15:55
閱讀 2677·2019-08-30 15:54
閱讀 2489·2019-08-30 13:47
閱讀 3366·2019-08-30 11:27
閱讀 1146·2019-08-29 13:21