日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

編碼方式的簡介(ASCII, LATIN

 liang1234_ 2018-04-10

編碼方式的簡介

1. ASCII

ASCII是7比特的字符集,涵蓋了英語中的絕大多數(shù)字符。編碼從0到127.

2. ISOLatin-1(the ISO-8859-1 standard)

ISO Latin-1是8比特的字符集,定義了256個字符。前128個字符(00000000-01111111)與ASCII完全一致。

 

3. Unicode

Unicode只是定義了字符的編碼值,并未指定值以何種形式存儲。比如漢字“田”的Unicode編碼是7530,轉(zhuǎn)換為二進制是01110101,00110000。比方現(xiàn)在定義一種unicode的實現(xiàn)方式UTF-FAKE,規(guī)則是

a.      使用24個字節(jié)

b.      每個字節(jié)的高7位都是1

c.      每個字節(jié)的最末一位存儲unicode編碼值

那么01110101,00110000的存儲形式是

11111110, 11111110, 11111110, 11111110, 11111110, 11111110, 11111110, 11111110,

11111110, 11111111, 11111111, 11111111, 11111110, 11111111, 11111110, 11111111

11111110, 11111110, 11111111, 11111111, 11111110, 11111110, 11111110, 11111110

其中末位為藍色0的字節(jié)為補足字節(jié)。

實際使用的編碼方式UTF-8使用三個字節(jié)存儲“田” 01110101,00110000,如下

11100111, 10010100, 10110000

 

Unicode的第一個版本于1991年發(fā)布,該版本允許的的最大編碼空間是兩個字節(jié)。96年發(fā)布的Unicode 2.0版本引入了surrogate pair,將Unicode的編碼數(shù)目擴充到了百萬級,由于可見的將來該數(shù)目不大可能用光,因此Unicode委員會對外宣稱該上限永不會更改。Surrogate pair在UTF-16和UTF-32中得到了實現(xiàn)。Unicode的前256個字符及編碼值與Latin-1完全一致。比如大寫字母A在Latin-1和Unicode中的編碼值都是0x41(十進制的65)。

Unicode的編碼值范圍是 000000hex 10FFFFhex,可劃分為17個plane,每個plane包含65536(= 216)個字符。Plane的代碼從0到16(十進制),對應于 000000hex,010000hex020000hex,… … ,0F0000hex10FFFFhex的藍色部分。

Unicode的表示方式一般是”U ”后綴上4到6個十六進制字符,如”田“的Unicode表示方式是U 7530。

 

4. UTF-8

UTF-8采用可變長度的編碼,長度從1到4個字節(jié)不等。某些應用識別非標準的'utf8' 或'UTF 8'別名。只有ASCII字符在UTF-8中使用一個字節(jié)編碼,且值與ASCII完全相同,其余字符在UTF-8中使用2到4個字節(jié)。因此UTF-8中的單字節(jié)且只有單字節(jié)編碼字符的最高的1個比特是0。

UTF-8對Unicode字符的編碼規(guī)則如下

 

Bits of
code point

First
code point

Last
code point

Bytes in
sequence

Byte 1

Byte 2

Byte 3

Byte 4

  7

U 0000

U 007F

1

0xxxxxxx

11

U 0080

U 07FF

2

110xxxxx

10xxxxxx

16

U 0800

U FFFF

3

1110xxxx

10xxxxxx

10xxxxxx

21

U 10000

U 1FFFFF

4

11110xxx

10xxxxxx

10xxxxxx

10xxxxxx

 

說明如下:

1.   只有ASCII使用單字節(jié)編碼

2.   Unicode編碼值大于127的字符使用多個字節(jié)編碼。多字節(jié)序列的第一個字節(jié)稱為leading byte,后續(xù)的字節(jié)稱為continuation bytes。Leading byte的高位是110,1110或11110,其中的“1”的個數(shù)標明了序列中的字節(jié)總數(shù)。如2個字節(jié)序列的leading byte為110xxxxx,其中的11標明了這是一個雙字節(jié)的序列,亦即該序列有1個continuation byte。Continuation bytes的每個字節(jié)的高兩位均是10。

3.  單字節(jié)序列、leading bytes和continuationbytes的高位分別是0,110/1110/11110和10,因此不會混淆。

還是以漢字”田“為例,展示Unicode字符如何按照UTF-8存儲。”田“的Unicode值是U 7530,比對上表發(fā)現(xiàn)介于U 0800 - U FFFF之間,因此需要3個字節(jié)來存儲。7530轉(zhuǎn)為二進制是1110101,00110000,一共15位。但由于UTF-8的3字節(jié)編碼存儲16個比特,因此將1110101,00110000的高一位補零變成16比特01110101,00110000。然后將這16比特依次填入三字節(jié)序列1110xxxx 10xxxxxx 10xxxxxx的x中,得到結(jié)果

11100111 10010100 10110000,寫成16進制就是E7 94 B0

注意:雖然Unicode中的前256個字符及編碼值與Latin-1完全一致,但UTF-8只對前128個即ASCII字符采用單字節(jié)編碼,其余128個Latin-1字符是采用2個字節(jié)編碼。因此ASCII編碼的文件可以直接以UTF-8方式讀取,而Latin-1的文件若包含值為128-255的字符則不可以。

5. UTF-16

UTF-16也是采用可變長度編碼,可以是一個或者兩個16比特。某些應用中允許使用非標準的UTF_16或者UTF16作為別名。Unicode中的第一個plane的65536(= 216)codepoints采用16比特編碼,其余的16個plane均采用2個16比特編碼。采用2個16比特編碼的前后兩個16bit分別稱為lead surrogate pair和trail surrogate pair,之所以稱為surrogate是因為單獨一個16bit不代表任何字符,只有組合起來才有意義。

既然UTF-16也是可變長度編碼,如何區(qū)分某個16bit是單獨表示一個字符還是與后續(xù)的16bit組合起來表示一個字符呢?Unicode將D800–DBFF和DC00–DFFF這兩個范圍作為保留區(qū)間,沒有將之分配給任何Unicode字符,若某16比特落在D800–DBFF范圍內(nèi),便可將之視為采用2個16bit編碼字符的第一個16bit,而落在DC00–DFFF的16bit可視為采用2個16bit編碼字符的第二個16bit。這就使得Unicode第一個plane實際可分配使用的code points只有65536 – (DFFF - D800 1) = 65536 – 8*256 = 63488。

采用一個16bit編碼的Unicode字符在UTF-16中的編碼值與其在Unicode中是相等的,比如英文大寫字母A的Unicode值是U 0041,其UTF-16編碼是0041 hex 。Unicode第二到第十七個plane采用兩個16bit即surrogate pairs的字符從其Unicode code point到UTF-16的轉(zhuǎn)換規(guī)則是

1.  范圍為0x10000 … 0x10FFFF的codepoint減去0x010000,減過后的結(jié)果范圍是0x00000到0xFFFFF,使得該結(jié)果可以使用5位16進制亦即20位2進制數(shù)表示

2.  結(jié)果中高10位(范圍是0x0到0x3FF)加上0xD800(結(jié)果范圍是0xD800到0xDBFF)作為雙16bit的第一個16bit即leadsurrogate

3.  結(jié)果中低10位(范圍是0x0到0x3FF)加上0xDC00(結(jié)果范圍是0xDC00到0xDFFF)作為雙16bit的第二個16bit即trailsurrogate

 

這樣UTF-16與UTF-8都是self-synchronizing的,即某個16bit是否是一個字符的開始無需檢查其前一個或者后一個16bit。與UTF-8的不同之處是,UTF-16不支持從某個隨機的字節(jié)開始讀取。

舉例:UTF-16 序列 0041, D801DC01 (字符'A'),若第一個字節(jié)丟失即從第二個字節(jié)讀取,那么UTF-16認為序列是41D8,01DC,01;而UTF-8不存在這個問題。


BOM(byte-order mark)

BOM是Unicode中用來標識字節(jié)順序的字符。

對于UTF16和UTF32,由于編碼單元分別是16bit和32bit,即2個和4個字節(jié),編碼單元內(nèi)字節(jié)的順序就取決于計算機的體系結(jié)構(gòu)。以英文大寫字母A和漢字田為例,大端(big endianness,縮寫為BE)和小端(littleendianness,縮寫為LE)存儲的字節(jié)序列是


UTF-16BE

UTF-16LE

UTF-32BE

UTF-32BE

A

00,41

41,00

00,00,00,41

41,00,00,00

75,30

30,75

00,00,75,30

30,75,00,00

 

BOM就是用來標識編碼使用的是大端還是小端存儲,該符號位于文本序列起始字節(jié)之前。

 

UTF-8

UTF-8中的BOM是 0xEF,0xBB,0xBF。Unicode標準里面允許UTF-8使用BOM,但并不要求也不鼓勵使用。由于UTF8編碼單位是字節(jié),字節(jié)的先后順序在編碼、傳輸和解碼過程中均不改變,因此不存在endianness。BOM在UTF8中的唯一作用是標識序列使用的是UTF8編碼,在由其它使用BOM的編碼轉(zhuǎn)換為UTF8編碼的情況下,建議在UTF8序列中保留BOM以便轉(zhuǎn)換回原編碼的時候不丟失BOM信息。

 

接下來看看用Notepad 的HEX-Editor插件查看的文件16進制的編碼。

文件中僅包含一個英文大寫字母A,其Unicode編碼值是U 0041。

使用UTF-8(缺省包含BOM),字節(jié)序列是ef bb bf 41

  

 


 

使用不帶BOM的UTF-8,字節(jié)序列是 41。

 

 


UTF-16

UTF-16中bigendianness和littleendianness的BOM分別是U FEFF和U FFFE??梢允褂镁幋a方式UTF-16BE和UTF-16LE來顯式地標明字節(jié)順序,當使用了UTF-16BE和UTF-16LE時,BOM不應該再出現(xiàn)在字節(jié)序列中,很多應用直接忽略該字符若其仍然存在。

由于Notepad 不支持UTF16編碼,因此下面的截圖中使用了UTF-16的前身UCS-2來替代。UCS-2對Unicode的第一個plane的編碼與UTF-16相同,都是1個16bit,且編碼結(jié)果相同。

 


UTF-32

UTF32中的bigendianness和littleendianness的BOM分別是0000FEFF和FFFE0000。


總結(jié)五種編碼方式的BOM依次是

 

BOM

編碼方式

00 00 FE FF

UTF-32, big-endian

FF FE 00 00

UTF-32, little-endian

FE FF

UTF-16, big-endian

FF FE

UTF-16, little-endian

EF BB BF

UTF-8

 


    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多