UTF-8簡(jiǎn)介
UTF-8是一種針對(duì)Unicode的可變長(zhǎng)度字符編碼,又稱萬(wàn)國(guó)碼。
UTF-8用1到6個(gè)字節(jié)編碼UNICODE字符。
UTF-8編碼規(guī)則
如果只有一個(gè)字節(jié)則其最高二進(jìn)制位為0;
如果是多字節(jié),其第一個(gè)字節(jié)從最高位開始,連續(xù)的二進(jìn)制位值為1的個(gè)數(shù)決定了其編碼的字節(jié)數(shù),其余各字節(jié)均以10開頭。
Unicode/UCS-4 | bit數(shù) | UTF-8 | byte數(shù) | 備注 |
0000~ 007F | 0~7 | 0XXX XXXX | 1 | |
0080~ 07FF | 8~11 | 110X XXXX 10XX XXXX | 2 | |
0800~ FFFF | 12~16 | 1110XXXX 10XX XXXX 10XX XXXX | 3 | 基本定義范圍:0~FFFF |
1 0000~ 1F FFFF | 17~21 | 1111 0XXX 10XX XXXX 10XX XXXX 10XX XXXX | 4 | Unicode6.1定義范圍:0~10 FFFF |
20 0000~ 3FF FFFF | 22~26 | 1111 10XX 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX | 5 | 說(shuō)明:此非unicode編碼范圍,屬于UCS-4編碼 早期的規(guī)范UTF-8可以到達(dá)6字節(jié)序列,可以覆蓋到31位元(通用字符集原來(lái)的極限)。盡管如此,2003年11月UTF-8被RFC 3629重新規(guī)范,只能使用原來(lái)Unicode定義的區(qū)域,U+0000到U+10FFFF。根據(jù)規(guī)范,這些字節(jié)值將無(wú)法出現(xiàn)在合法UTF-8序列中 |
400 0000~ 7FFF FFFF | 27~31 | 1111 110X 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX 10XX XXXX | 6 |
UTF-8優(yōu)點(diǎn)
UTF-8編碼可以通過(guò)屏蔽位和移位操作快速讀寫。字符串比較時(shí)strcmp()和wcscmp()的返回結(jié)果相同,因此使排序變得更加容易。字節(jié)FF和FE在UTF-8編碼中永遠(yuǎn)不會(huì)出現(xiàn),因此他們可以用來(lái)表明UTF-16或UTF-32文本(見BOM) UTF-8 是字節(jié)順序無(wú)關(guān)的。它的字節(jié)順序在所有系統(tǒng)中都是一樣的,因此它實(shí)際上并不需要BOM。
UTF-8缺點(diǎn)
你無(wú)法從UNICODE字符數(shù)判斷出UTF-8文本的字節(jié)數(shù),因?yàn)閁TF-8是一種變長(zhǎng)編碼它需要用2個(gè)字節(jié)編碼那些用擴(kuò)展ASCII字符集只需1個(gè)字節(jié)的字符 ISO Latin-1 是UNICODE的子集,但不是UTF-8的子集 8位字符的UTF-8編碼會(huì)被email網(wǎng)關(guān)過(guò)濾,因?yàn)閕nternet信息最初設(shè)計(jì)為7位ASCII碼。因此產(chǎn)生了UTF-7編碼。 UTF-8 在它的表示中使用值100xxxxx的幾率超過(guò)50%, 而現(xiàn)存的實(shí)現(xiàn)如ISO 2022, 4873, 6429, 和8859系統(tǒng),會(huì)把它錯(cuò)認(rèn)為是C1 控制碼。因此產(chǎn)生了UTF-7.5編碼。