Unicode是字符集,給每個(gè)字符一個(gè)唯一的編碼,目前的版本用4個(gè)字節(jié)表示所有的字符。
UTF是 unicode transformation format,是把字符保存到計(jì)算機(jī)上的格式。
UTF-8是變長的
UTF-16是2或4個(gè)字節(jié)
UTF-32是4個(gè)字節(jié)
要知道具體是哪種編碼方式,需要判斷文本開頭的標(biāo)志,下面是所有編碼對應(yīng)的開頭標(biāo)志
EF BB BF UTF-8
FE FF UTF-16/UCS-2, little endian
FF FE UTF-16/UCS-2, big endian
FF FE 00 00 UTF-32/UCS-4, little endian.
00 00 FE FF UTF-32/UCS-4, big-endian.
其中的UCS是ISO制定的標(biāo)準(zhǔn),和Unicode是完全一樣的,只不過名字不一樣.ucs-2對應(yīng)utf-16,ucs-4對應(yīng)UTF-32.UTF-8是沒有對應(yīng)的UCS
UTF-8的優(yōu)點(diǎn):
- 字符空間足夠大,未來 Unicode 新標(biāo)準(zhǔn)收錄更多字符,UTF-8 也能妥妥的兼容,因此不會(huì)再出現(xiàn) UTF-16 那樣的尷尬
- 不存在大小端字節(jié)序問題,信息交換時(shí)非常便捷
- 容錯(cuò)性高,局部的字節(jié)錯(cuò)誤(丟失、增加、改變)不會(huì)導(dǎo)致連鎖性的錯(cuò)誤,因?yàn)?UTF-8 的字符邊界很容易檢測出來,這是一個(gè)巨大的優(yōu)點(diǎn)(正是為了實(shí)現(xiàn)這一點(diǎn),咱們中日韓人民不得不忍受 3 字節(jié) 1 個(gè)字符的苦日子)
UTF-8的缺點(diǎn):
- 文化上的不平衡——對于歐美地區(qū)一些以英語為母語的國家 UTF-8 簡直是太棒了,因?yàn)樗?ASCII 一樣,一個(gè)字符只占一個(gè)字節(jié),沒有任何額外的存儲(chǔ)負(fù)擔(dān);但是對于中日韓等國家來說,UTF-8 實(shí)在是太冗余,一個(gè)字符竟然要占用 3 個(gè)字節(jié),存儲(chǔ)和傳輸?shù)男什坏珱]有提升,反而下降了。所以歐美人民常常毫不猶豫的采用 UTF-8,而我們卻老是要猶豫一會(huì)兒
- 變長字節(jié)表示帶來的效率問題——大家對 UTF-8 疑慮重重的一個(gè)問題就是在于其因?yàn)槭亲冮L字節(jié)表示,因此無論是計(jì)算字符數(shù),還是執(zhí)行索引操作效率都不高。為了解決這個(gè)問題,常常會(huì)考慮把 UTF-8 先轉(zhuǎn)換為 UTF-16 或者 UTF-32 后再操作,操作完畢后再轉(zhuǎn)換回去。而這顯然是一種性能負(fù)擔(dān)。
UTF-16的缺點(diǎn):
- UTF-16 能表示的字符數(shù)有 6 萬多,看起來很多,但是實(shí)際上目前 Unicode 5.0 收錄的字符已經(jīng)達(dá)到 99024 個(gè)字符,早已超過 UTF-16 的存儲(chǔ)范圍;這直接導(dǎo)致 UTF-16 地位頗為尷尬——如果誰還在想著只要使用 UTF-16 就可以高枕無憂的話,恐怕要失望了
- UTF-16 存在大小端字節(jié)序問題,這個(gè)問題在進(jìn)行信息交換時(shí)特別突出——如果字節(jié)序未協(xié)商好,將導(dǎo)致亂碼;如果協(xié)商好,但是雙方一個(gè)采用大端一個(gè)采用小端,則必然有一方要進(jìn)行大小端轉(zhuǎn)換,性能損失不可避免(大小端問題其實(shí)不像看起來那么簡單,有時(shí)會(huì)涉及硬件、操作系統(tǒng)、上層軟件多個(gè)層次,可能會(huì)進(jìn)行多次轉(zhuǎn)換)
- 另外,容錯(cuò)性低有時(shí)候也是一大問題——局部的字節(jié)錯(cuò)誤,特別是丟失或增加可能導(dǎo)致所有后續(xù)字符全部錯(cuò)亂,錯(cuò)亂后要想恢復(fù),可能很簡單,也可能會(huì)非常困難。(這一點(diǎn)在日常生活里大家感覺似乎無關(guān)緊要,但是在很多特殊環(huán)境下卻是巨大的缺陷)