程序員的自我修養(yǎng)-字符編碼

看了阮一峰的Blog(很久之前的),突然就發(fā)現(xiàn)這么一個(gè)非常常見的問題,常常被我視而不見。而且我相信,有很大一部分同學(xué)應(yīng)該和我一樣,對(duì)此模棱兩可?;蛟S在很久之前在某次面試或考試之前準(zhǔn)備過如此“冷門”的知識(shí),現(xiàn)在早已拋之腦后。其實(shí)我們經(jīng)常會(huì)遇到“?????????”和類似“燙燙燙燙”的玩意,對(duì)于這樣經(jīng)常造訪的老朋友背后的技術(shù)細(xì)節(jié)我們有必要了解。

這里我偷懶引用兩篇寫的非常好的Blog作為內(nèi)容,因?yàn)閷懙奶宄?,太易懂。本著不重?fù)發(fā)明輪子的原則,我就借花獻(xiàn)佛。

阮一峰字符編碼常識(shí)及問題解析 閱讀完后一定會(huì)對(duì)編碼有了基本的了解,同時(shí)對(duì)目前最為主流的utf-8,有清晰的認(rèn)識(shí)。這樣以后再處理亂碼問題,就比起之前更游刃有余。

其中對(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。剩下的沒有提及的二進(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)制位開始,依次從后向前填入格式中的x,多出的位補(bǔ)0。這樣就得到了,"嚴(yán)"的UTF-8編碼是"11100100 10111000 10100101",轉(zhuǎn)換成十六進(jìn)制就是E4B8A5。
摘自阮一峰-字符編碼筆記:ASCII,Unicode和UTF-8

其中幾個(gè)要點(diǎn),

  1. utf-8是可變長(zhǎng)的,目前使用廣泛,而且兼容ASCII
  2. 注意填寫漢字編碼時(shí)是從低位往高位,保證高位多余位置0

參考blog:
阮一峰-字符編碼筆記:ASCII,Unicode和UTF-8
字符編碼常識(shí)及問題解析

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容