文章出處

最近在用AngularJS進行開發時遇到了靈異事件,從某網站拷貝下來的看似無比正確的代碼運行總是出錯。

經驗告訴我們,看上去正確的代碼可能實際上并不正確。我是指字符層面上。其中可能存在亂碼,存在奇怪的空白字符,這些均會導致問題。

然而我仔細檢查了一番,并未發現亂碼和多余空格。唯一的異常情況是,AngularJS的插值字符串{{xxx}}在Visual Studio中的代碼著色不太對。在安裝了VS的最新Web工具后,這插值字符串中xxx應當被編輯器識別并顯示紫色,{{和}}會加粗顯示,但是這一段粘貼來的代碼中它們仍顯示藍色,和正常HTML attribute一樣。

我起初并未放在心上,以為這只是VS的一個小bug。但諸般走投無路后,我開始重新審視這個異常。當我嘗試就地手打一個{{進去并觀察到正確的加粗、著色后,我認為目標已鎖定。

我復制了這個手打的{{并粘貼取代原來的“{{”,那著色一下子就正常了。替換了所有的插值字符串后,程序運行完全正常了。

很明顯,這看上去完全一樣的“{{”是不同的字符。在Chrome Console中檢驗相等性,返回false。

但到了這一步,我的思維還未達到。我推斷其中至少有一個{不同。用charCodeAt()函數檢驗一下,果然,charCodeAt(0)為123,這是正常的{符號無疑;charCodeAt(1)返回8203,這是個什么鬼!是{的孿生兄弟嗎?

不是的。查找資料后得知,這個字符叫做Zero Width Space,中文可稱為“零寬空白”。看到這里我恍然大悟,原來之前我一直被騙了,那個邪惡的字符串居然不是你看到的兩個字符,而是三個。參見維基百科

http://zh.wikipedia.org/wiki/%E7%A9%BA%E6%A0%BC

8203字符即其中的U+200B。

一個有趣的JSFuck式的應用見

http://ucren.com/blog/archives/549

http://mn.tn/dev/z.js/

這個字符在主流文本編輯器中均沒有任何顯示效果,就像一只看不見、摸不著的幽靈。我一般習慣讓文本編輯器顯示空白字符,以區分普通空白、制表符、換行符等,但是遇到這個零寬空白,我真是給跪了。


文章列表


不含病毒。www.avast.com
全站熱搜
創作者介紹
創作者 大師兄 的頭像
大師兄

IT工程師數位筆記本

大師兄 發表在 痞客邦 留言(0) 人氣()