看了阮一峰的Blog(很久之前的),突然就發(fā)現(xiàn)這么一個(gè)非常常見(jiàn)的問(wèn)題捣鲸,常常被我視而不見(jiàn)瑟匆。而且我相信,有很大一部分同學(xué)應(yīng)該和我一樣栽惶,對(duì)此模棱兩可愁溜〖残幔或許在很久之前在某次面試或考試之前準(zhǔn)備過(guò)如此“冷門(mén)”的知識(shí),現(xiàn)在早已拋之腦后冕象。其實(shí)我們經(jīng)常會(huì)遇到“?????????”和類似“燙燙燙燙”的玩意代承,對(duì)于這樣經(jīng)常造訪的老朋友背后的技術(shù)細(xì)節(jié)我們有必要了解。
這里我偷懶引用兩篇寫(xiě)的非常好的Blog作為內(nèi)容渐扮,因?yàn)閷?xiě)的太清楚论悴,太易懂。本著不重復(fù)發(fā)明輪子的原則墓律,我就借花獻(xiàn)佛膀估。
阮一峰 和 字符編碼常識(shí)及問(wèn)題解析 閱讀完后一定會(huì)對(duì)編碼有了基本的了解,同時(shí)對(duì)目前最為主流的utf-8耻讽,有清晰的認(rèn)識(shí)察纯。這樣以后再處理亂碼問(wèn)題,就比起之前更游刃有余针肥。
其中對(duì)于utf-8 部分捐寥,兩篇描述各有側(cè)重,我做個(gè)摘要
UTF-8是Unicode的實(shí)現(xiàn)方式之一祖驱。
UTF-8最大的一個(gè)特點(diǎn),就是它是一種變長(zhǎng)的編碼方式瞒窒。它可以使用1~4個(gè)字節(jié)表示一個(gè)符號(hào)捺僻,根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度。
UTF-8的編碼規(guī)則很簡(jiǎn)單崇裁,只有二條:
1)對(duì)于單字節(jié)的符號(hào)匕坯,字節(jié)的第一位設(shè)為0,后面7位為這個(gè)符號(hào)的unicode碼拔稳。因此對(duì)于英語(yǔ)字母葛峻,UTF-8編碼和ASCII碼是相同的。
2)對(duì)于n字節(jié)的符號(hào)(n>1)巴比,第一個(gè)字節(jié)的前n位都設(shè)為1术奖,第n+1位設(shè)為0,后面字節(jié)的前兩位一律設(shè)為10轻绞。剩下的沒(méi)有提及的二進(jìn)制位采记,全部為這個(gè)符號(hào)的unicode碼。
以漢字"嚴(yán)"為例政勃,演示如何實(shí)現(xiàn)UTF-8編碼唧龄。
已知"嚴(yán)"的unicode是4E25(100111000100101),根據(jù)上表奸远,可以發(fā)現(xiàn)4E25處在第三行的范圍內(nèi)(0000 0800-0000 FFFF)既棺,因此"嚴(yán)"的UTF-8編碼需要三個(gè)字節(jié)讽挟,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后丸冕,從"嚴(yán)"的最后一個(gè)二進(jìn)制位開(kāi)始耽梅,依次從后向前填入格式中的x,多出的位補(bǔ)0晨仑。這樣就得到了褐墅,"嚴(yán)"的UTF-8編碼是"11100100 10111000 10100101",轉(zhuǎn)換成十六進(jìn)制就是E4B8A5洪己。
摘自阮一峰-字符編碼筆記:ASCII妥凳,Unicode和UTF-8
其中幾個(gè)要點(diǎn),
- utf-8是可變長(zhǎng)的答捕,目前使用廣泛逝钥,而且兼容ASCII
- 注意填寫(xiě)漢字編碼時(shí)是從低位往高位,保證高位多余位置0
參考blog:
阮一峰-字符編碼筆記:ASCII拱镐,Unicode和UTF-8
字符編碼常識(shí)及問(wèn)題解析