兩個"�"="錕斤拷"?

關於做者:程序猿石頭(ID: tangleithu),現任阿里巴巴技術專家,清華學渣,前大疆後端 Leader。歡迎關注,交流和指導!前端

本文首發於微信公衆號,原文連接,轉載請全文保留。算法

以一首七言絕句做爲開篇:後端

手持兩把錕斤拷數組

口中疾呼燙燙燙微信

腳踏千朵屯屯屯app

笑看萬物鍩鍩鍩學習

� 爲什麼物?

在上次石頭哥發的這篇文章中 —— 你可能也會掉進這個簡單的 String 的坑,講述了因字符編碼問題而連續踩坑的經歷,文中有一個神奇的字符 「�」。編碼

其實,這個 「�」 真是無處不在,好比大名鼎鼎的微信:.net

微信中的�

再好比,封面圖中,單價22元的「錕斤拷錕斤拷」,再隨便百度一把:3d

隨處可見的�

要弄清這個問題,還得先從編碼談起。

由於在計算機的眼裏,都是二進制,具體用哪些二進制數字表示哪一個符號,這就是編碼。不要把編碼想象得太複雜,其實就是一個很簡單的 mapping。

好比你們所熟知的 ASCII 編碼,規定了
二進制的0100 0001,也就是十進制的65,表明的含義就是大寫字母 A

ASCII 編碼

 也是一種編碼字符,就跟上面的 A 同樣同樣的,它是 UNICODE 編碼方式中的一個特殊的字符,也就是 0xFFFD(65533),語義是一個佔位符(REPLACEMENT CHARACTER),用來表達未知的,本身不認識的東西。

好比上篇文章中的實驗截圖的,紅色部分圈出來的對應的字符,UTF-8 編碼都不認識,因此按照 UNICODE 的定義,我就只好用統一的一個佔位符 —— 0xFFFD(65533) 來表示。

爲何會出現「錕斤拷」?

咱們接着上篇的例子來看, 以下圖所示,仍然從 「程序猿石頭」 對應二進制編碼截取部分:

如上圖所示,第 18 行的字節數組 new byte[] {-25, -119, -25, -116}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)

<0xEFBF,0xBDEF,0xBFBD

如今,你知道了嗎?

留個做業題:開篇的七言絕句,你知道另外的梗是來自哪裏嗎?歡迎留言討論。

最近看到一份來自阿里巴巴開源的學習資料,涵蓋了大前端、客戶端、服務端、算法等多個技術領域,全書內容⻚數1600+,如今分享給你們。點擊原文獲取

相關文章
相關標籤/搜索