2017年3月14日

一個神奇的偶然: Kevin Durant 的新外號「鬮鶦S」


Kevin Durant 左膝一受傷,在 PTT 上就多了個新外號「鬮鶦S」,什麼呀?

原始文章: https://www.ptt.cc/bbs/NBA/M.1488419159.A.3D1.html

快笑死了。 XDD


這是個複製貼上掉資料的結果。「杜蘭特」三個字在電腦裡的 Big5 編碼是:

杜 = '\xa7\xf9'
蘭 = '\xc4\xf5'
特 = '\xaf\x53'

這裡 \x 是 16 進位的的意思。每個字兩個位元,合起來是 '\xa7\xf9\xc4\xf5\xaf\x53'

複製貼上時不小心掉了第一個位元,變成 '\xf9\xc4\xf5\xaf\x53'。電腦在解讀這串字的時候,就把前兩個位元當成第一個字,中間兩個位元當成第二個字:

'\xf9\xc4' = 鬮
'\xf5\xaf' = 鶦
'\x53' = S

就這樣成了「鬮鶦S」。

鬮 = 鬥龜,他在雷霆時的前隊友 Russel Westbrook 在 PTT 上的外號是什麼?忍者龜。

鶦 = 胡鳥,他在雷霆時的前隊友 James Harden 在 PTT 上的外號是什麼?鬍子。

一個名字裡雷霆三少全出現,想不紅也難!哈哈哈哈~~~


笑完後還是要來打破砂鍋問個為什麼。追根究底,PTT 仍在使用 Big5 編碼也是原因之一。

>>> print kevin_big5.decode('big5')
杜蘭特
>>> print kevin_big5[1:].decode('big5') # 跳過第一個位元
鬮鶦S

如果是用 Unicode 的 UTF-8 編碼,一樣掉第一個位元,結果就只是杜字變成兩塊豆腐,不會影響後面的字。

>>> print kevin_utf8
杜蘭特
>>> print kevin_utf8[1:] # 跳過第一個位元
��蘭特

這是因為 UTF-8 有防錯設計,很容易分辨第一個位元和後續位元,代價是要用比較多空間表示中文字,杜蘭特三個字各用了三個位元,杜字的第一位元掉了,電腦看到兩個沒頭沒腦的後續位元,就顯示成豆腐,但後面的蘭字就不會錯了。

PTT 會改用 Unicode 嗎?

10 則留言 :

  1. 登入 PTT 時,在 ID 結尾處多加上一個逗號(,)的話,就會進入 UTF-8 模式。

    回覆刪除
    回覆
    1. 秘技!!!學到了。 m(_._)m

      顯然貼文的人也不知道這招。

      刪除
    2. 這功能我寫的,時光飛逝,十幾年都過去了 orz

      刪除
    3. 哇,第一次聽到有這功能。太秘技了吧!

      刪除
  2. 另一個方法是 ssh bbsu@ptt.cc 這樣也會進 UTF-8 模式……

    回覆刪除
    回覆
    1. 竟然有這種祕技,這樣不用改terminal編碼就能直接連ptt?

      刪除
  3. 「笑完後還是要來打破砂鍋問個為什麼。追根究底,PPT 仍在使用 Big5 編碼也是原因之一。」
    PTT 打太多次結果打成 PPT 了嗎 XD

    回覆刪除
  4. Big5 的雙色中文字怎麼轉換成 UTF-8?

    回覆刪除
    回覆
    1. 顏色不是用 terminal 控制碼控制的嗎?雙色不會是左右不同色吧? @_@

      刪除