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 嗎?

12 則留言 :

  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 控制碼控制的嗎?雙色不會是左右不同色吧? @_@

      刪除
  5. PTT 不轉過去的主要難點確實是雙色字,那個確實是一個全形字左右邊不同色,所以只限 DBCS 字元才能做,
    例如如果要把"杜"字左邊塗紅色右邊塗綠色就要用 "*[31m?*[32m?" 其中前一個 ? 是 \xa7, 後一個 ? 是 \xf9。
    (這個兩半邊不是照字型分,是照半型字空間在分,也就是利用等寬字體的 terminal 著色機制做成的兩邊不同色。)
    這個技巧大量的在 ANSI 圖裡使用,所以轉過去圖基本上就爛光了。
    (用 bbsu 上線就可以看到爛掉的進站圖)

    一些比較小的問題還有 Unicode 本身對一些 Big5 裡的雙寬字定義成不定寬或單寬字的問題。
    (例如希臘字母/西里爾字母是單寬,表格字元是不定寬等等,但 Big5 全部當它們是雙寬字)
    這會造成對於假設雙位元組字都是雙寬字的排版造成問題。

    然後其實 PTT 現在已經是 de facto 的 Big5-UAO 了 (遠目)
    這個又可以扯一篇所以先在此打住。

    回覆刪除