手持兩把錕斤拷,
口中疾呼燙燙燙。
腳踏千朵屯屯屯,
笑看萬物鍩鍩鍩。
� 為何物?其實,這個 「�」 真是無處不在,比如大名鼎鼎的微信:
微信中的�再比如,封面圖中,單價22元的「錕斤拷錕斤拷」,再隨便百度一把:
隨處可見的�要弄清這個問題,還得先從編碼談起。
因為在計算機的眼裡,都是二進位,具體用哪些二進位數字表示哪個符號,這就是編碼。不要把編碼想像得太複雜,其實就是一個很簡單的 mapping。
比如大家所熟知的 ASCII 編碼,規定了二進位的0100 0001,也就是十進位的65,代表的含義就是大寫字母 A。
ASCII 編碼� 也是一種編碼字符,就跟上面的 A 一樣一樣的,它是 UNICODE 編碼方式中的一個特殊的字符,也就是 0xFFFD(65533),語義是一個佔位符,用來表達這套編碼系統中未知的、自己不認識的東西。
比如下面的實驗截圖,紅色部分圈出來的對應的字符,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)。
錕斤拷(可向右滑動)
現在,你知道了嗎?
最後,你知道開篇的五言絕句,另外的梗是來自哪裡嗎?