Read Sean

          Read me, read Sean.
          posts - 508, comments - 655, trackbacks - 9, articles - 4

          本來(lái)是手寫的一張草稿,清理臺(tái)面的時(shí)候,正要扔,發(fā)現(xiàn)內(nèi)容還有點(diǎn)意思,干脆吧,開(kāi)個(gè)隨筆記錄一下,備忘,說(shuō)不定還能幫到別人。

          在我們?nèi)粘I詈凸ぷ髦校绕錇g覽含有中文的網(wǎng)站,時(shí)常會(huì)為亂碼問(wèn)題犯愁,一些天生Unicode支持不到位的編程語(yǔ)言和軟件更是加重了這個(gè)現(xiàn)象。雖說(shuō)已經(jīng)是2009年了,我們時(shí)不時(shí)還是能碰到一些明顯腦殘的code,吐出一堆亂碼,不論你用選什么字符集,似乎都無(wú)法還原最初的中文。比如"?·2",或者同一個(gè)頁(yè)面,無(wú)法用同一個(gè)字符集顯示,任何一種字符都至少有一部分顯示不正確,不是這兒就是那兒。

          首先科普一下UTF-8。UTF-8是Unicode所有字符編碼實(shí)現(xiàn)中,應(yīng)用范圍最廣的一個(gè),最大的特點(diǎn)是兼容ASCII碼,在此基礎(chǔ)上,通過(guò)1..4個(gè)byte來(lái)表示每一個(gè)Unicode字符。它是怎么做到的?其實(shí)很簡(jiǎn)單,看首個(gè)byte:
          00000000 ~ 01111111 : 0~127 (ASCII, 單個(gè)byte) 表示Unicode范圍\u0000 ~ \u007F
          11000000 ~ 11011111 : (2個(gè)1打頭,所以2個(gè)byte) 表示Unicode范圍\u0080 ~ \u07FF
          11100000 ~ 11101111 : (3個(gè)1打頭,所以3個(gè)byte) 表示Unicode范圍\u0800 ~ \uFFFF
          11110000 ~ 11110111 : (4個(gè)1打頭,所以4個(gè)byte) 表示Unicode范圍\u10000 ~ \u10FFFF

          除了單個(gè)byte這個(gè)case,其他情況下,后續(xù)的byte均以10打頭。這些打頭的bit:10、110、1110、11110,都不作為具體編碼的一部分參與真正Unicode編碼的計(jì)算。所以1..4個(gè)byte,其有效位數(shù)分別為:7、11、16、21,因此才有了\u007F、\u07FF、\uFFFF這樣的臨界值,且4個(gè)byte的空間還有富余。

          有了這個(gè)基礎(chǔ)知識(shí),我們就來(lái)具體看看這個(gè)"已"字,是怎么被UTF-8表示的,以及為什么處理不當(dāng)?shù)拇a會(huì)最終輸出"?·2"。

          "已"字,用Unicode表示法,是\u5DF2,按照2個(gè)byte拆開(kāi)成二進(jìn)制表示:
          01011101 11110010
          如果用UTF-8編碼,采用1110???? 10?????? 10??????這個(gè)格式,?號(hào)部分填入上述01011101 11110010,得到
          11100101 10110111 10110010 這樣3個(gè)byte。

          好了,這個(gè)時(shí)候腦殘代碼出現(xiàn),假如它不認(rèn)識(shí)UTF-8,那么他會(huì)看到這樣3個(gè)前后沒(méi)有關(guān)聯(lián)的byte,在西歐Latin-1字符集(即ISO 8859-1)中,它們分別表示"?"、"·"、"2"這3個(gè)字符。如果把它們分別再按照UTF-8編碼,就成了:
          11000011 10100101 11000010 10110111 11000010 10110010
          完美的UTF-8編碼,只不過(guò),這完全是假象,只能通過(guò)非常規(guī)手段才能恢復(fù)它原本的樣子。


          主站蜘蛛池模板: 保山市| 樟树市| 金山区| 林西县| 巴东县| 荥阳市| 龙游县| 廊坊市| 叙永县| 黄浦区| 疏勒县| 密山市| 武川县| 双流县| 南投县| 太和县| 长顺县| 宁安市| 张家界市| 页游| 冀州市| 哈巴河县| 黔东| 扶绥县| 瑞昌市| 定襄县| 区。| 桐城市| 唐山市| 布拖县| 祁东县| 英山县| 柳林县| 汝州市| 五大连池市| 浦城县| 甘洛县| 中宁县| 怀柔区| 山丹县| 呼玛县|