以一首七言絕句作為開篇:
手持兩把錕斤拷
口中疾呼燙燙燙
腳踏千朵屯屯屯
笑看萬物鍩鍩鍩
在上次石頭哥發的這篇文章中 —— 你可能也會掉進這個簡單的 string 的坑,講述了因字元編碼問題而連續踩坑的經歷,文中有乙個神奇的字元 「�」。
要弄清這個問題,還得先從編碼談起。
比如大家所熟知的 ascii 編碼,規定了
二進位制的0100 0001
,也就是十進位制的65
,代表的含義就是大寫字母a
。
�
也是一種編碼字元,就跟上面的a
一樣一樣的,它是 unicode 編碼方式中的乙個特殊的字元,也就是 0xfffd(65533),語義是乙個佔位符(replacement character),用來表達未知的,自己不認識的東西。
比如上篇文章中的實驗截圖的,紅色部分圈出來的對應的字元,utf-8 編碼都不認識,所以按照 unicode 的定義,我就只好用統一的乙個佔位符 ——0xfffd(65533)
來表示。
我們接著上篇的例子來看, 如下圖所示,仍然從 「程式猿石頭」 對應二進位制編碼擷取部分:
如上圖所示,第 18 行的位元組陣列new byte
,utf-8
恰好都不認識,因此只能用佔位符替換。
這種情況,在編碼轉換過程中確實也比較常見,如果雙方沒溝通清楚,確實很容易出現互相不認識的情況。
在中文系統中,常見的字元編碼是 gbk,這個時候,因為大家沒提前商量清楚,我就預設按照 gbk 給你編碼看看。
驚不驚喜意不意外……
其實是因為,�
用utf-8
編碼後變成了0xefbfbd
(就是上面的位元組陣列[-17, -65, -67]
),兩個連起來就是0xefbfbdefbfbd
,也就是上面的位元組陣列[-17, -65, -67, -17, -65, -67]
。
而 gbk 編碼依然採用雙位元組編碼方案,因此上面的 6 位元組0xefbfbdefbfbd
,就被拆成了 3 個 2 位元組字元即0xefbf, 0xbdef, 0xbfbd
對應 gbk 編碼裡面就是:錕(0xefbf),斤(0xbdef),拷(0xbfbd)
,現在,你知道了嗎?
最近看到乙份來自阿里巴巴開源的學習資料,涵蓋了大前端、客戶端、服務端、演算法等多個技術領域,全書內容⻚數1600+,現在分享給大家。點選原文獲取。
經典亂碼錕斤拷
錕斤拷是什麼?我也是最近才搞明白的。我考證了一下,這個亂碼的原因 相當經典。unicode和老編碼體系的轉化過程中,肯定有一些字,用unicode是沒法表示的,unicode官方用了乙個佔位符來表示這些文字,這就是 u fffd replacement character 那麼u fffd的utf ...
考據 「燙燙燙」與「錕斤拷」的原理
在程式設計師 上經常看到乙個段子 滿滿的都是淚啊 手持兩把錕斤拷,口中疾呼燙燙燙。解釋一下為什麼會是這兩個東西不是別的 棍斤拷亂碼 源於gbk字符集和unicode字符集之間的轉換問題。unicode和老編碼體系的轉化過程中,肯定有一些字,用unicode是沒法表示的,unicode官方用了乙個佔位...
兩個明星 兩名水貨 兩個英超解說
兩個明星 兩名水貨 兩個英超解說 來自 撓頭蛇的blog 2006 03 30 08 54 42 大中小1 在這場算不上非常精彩的冠軍盃八強戰中,非常精彩的是兩名阿根廷人的表現。乙個是黃色的里克爾梅,他的護球簡直令人絕望 另乙個是藍黑的薩內蒂,他的狂飆突進幾乎讓人忘記了現代足球的陣型這個概念。看了里...