Saturday, December 29, 2012

能把屏幕「弄髒.̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̸̨̨̨̨̨̨̨̨̨̨̨̨」的 Tweet?好玩的 Unicode!

不久前照舊在 FlipBoard 上翻推,突然看到這條


意為:如您覺得屏幕上有東西,請不吝轉推。

頓時激活 Geek 屬性,決定探個究竟。

Step 1: Inspect Element


此乃 Web 攻城師必出利器﹣﹣這是圖片或神馬顏文字貼出的效果嗎?



貌似不是。源文件里,丫很調皮地「穿透」到下面的 html 去了,這必定不是圖片能出的效果。

Step 2: Copy & Paste


好吧,那就摳出來試試﹣﹣會不會是利用神馬瀏覽器的 bug 或隱藏屬性出來的效果呢?

於是從源碼里拷到文本編輯器里:


好淘氣的東東!我加行字看看……


呃。

Step 3: Python Shell


到此為止,可以確定這肯定是文本的東東,來,iPython 分析下:


討厭的傢伙,貼 terminal 里也是長長的一條!

接著這一步﹣﹣現形吧!


看出規律了吧:

u'.\u0338\u0338\u0328\u0338\u0338\u0328\u0338\u0338\u0338\u0328\u0338\u0338\u0328\u0338\u0338\u0328\u0338\u0328\u0338\u0338\u0328\u0338\u0338\u0328\u0338\u0328\u0338\u0338\u0328\u0338\u0338\u0328\u0338\u0328\u0338\u0338'


兩個問題:
  1. 第一個 "." 是幹啥的?
  2. 不斷重複的 \u0338 是什麼?

Step 4: Google


第一個 ”.“ 是幹啥的?
針對這個問題,我一開始瞎猜會不會是某種標誌位,使得系統把這個 \u0338 所代表的字符縱向排列;很快,自己隨便拿幾個 unicode 字符拼上這個小點點后,并不會讓它們縱向排列,結論無非就是一個普通的英文句點(也暴露了我對 unicode 相關知識的匱乏,哈哈)。

不斷重複的 \u0338 是什麼?
這回剩下一個疑問了,方向清晰后,其實就很簡單了:找出這個字符到底是什麼。

當然先問 Google 了「unicode characters lookup」,便找到這個網站:
http://www.fileformat.info/info/unicode/char/search.htm

把 \u0338 貼進去 Search,哦耶,結果粗線了:
http://www.fileformat.info/info/unicode/char/0338/index.htm

Step 5: Wikipedia


好吧,結果是一個「COMBINING LONG SOLIDUS OVERLAY」的字符,好晦澀難懂,懶人繼續搜索,得知它屬於「Combining Diacritical Marks」,這個 wiki 頁貌似也不夠好理解,繼續搜索,這回就到了親愛的維基百科了:
http://en.wikipedia.org/wiki/Combining_character

開頭第一段就是大白話,適合我不愛動腦子的這型:

In digital typography, combining characters are characters that are intended to modify other characters. The most common combining characters in the Latin script are the combining diacritical marks (including combining accents).


一句話:此乃類似註音符號的東東。

結語


自此豁然開朗也,註音符號干的事情就是修飾一個字符,它可以在字符的腦袋上,腳下,或周圍;我們能看到在那個普通點點之後,貼了一堆的 \u0338,幹啥?「反覆」修飾那個小點點唄,而這個符號是往下「長」的,重重疊疊,於是就看到了那樣「一條東西」,看起來把屏幕「弄髒」啦!

原理清楚了,那就自己也淘氣下嘍,哈哈。
https://twitter.com/xuyihua/status/262811006932221952