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