同事報案,某網站委託 OP 上線出現異常,連至本機查看詳細錯誤訊息,ASP.NET 回報看不懂 </location> 元素。

上圖的 <location path="Area51">...</location> 是本次新增設定,是應用先前介紹過的 Windows 驗證網站設定部分匿名存取技巧,用 <location> 針對部分路徑做不同設定的做法過去用得很多,不該有錯,更何況同一 web.config 的前一段就活生生是另一個 <location> 相安無事,惟獨新加的 <location> 有問題。

用記事本反覆檢查 web.config,兩個人四隻眼睛看到出血,逐字母檢查一遍又一遍,就是看不出哪裡有問題:

做了幾個測試:

  1. 將 <location path="Area51"> 改成 <location path="Shit" >,錯誤仍指向同段 <location>
  2. 將 <location path="Area51"> 該段刪除,網站正常
  3. 將 <location path="Area51"> 與前段 <location> 交換位置,錯誤仍指向 Area51 這則
  4. 將 <location path="Area51"> 該段刪除,另外重新輸入完全相同內容,網站正常

同事高呼「見鬼了」,老射手則嘟嚷:「不對,有妖氣!」。

請同事將 web.config 傳回本機用 Notepad++ 開啟,薑! 薑! 薑! 薑~ 答案揭曉,<location path="Area51"> 這段前方的縮排空白,其實是特殊字元:

這就能解釋為什麼只有這段 <location path="Area51"> 會出錯,刪掉正常,手工重打一次也正常。至於這些看似空白的字元從何而來,問了同事。原來是這段設定是透過 HipChat 交談追加的(如下圖示意),OP 直接複製對話內容貼上,未察覺縮排前方的空白其實是特殊字元。

而這些奇怪字元是什麼呢? 它們是 EN SPACE (&ensp;),UTF8 字碼為 0xe2 0x80 0x82:

以前只學過 &nbsp;(ASC 160) 其實還有 &ensp;、&emsp;,都屬於不會被合併的空白,而寬度分別為一個標準空白鍵字元、半個中文字寬及一個中文字寬(參考:HTML字元符號 &Nbsp; &Ensp; &Emsp; 的差異 - ShunNien's Blog)。

進一步爬文,在 Unicode 字元還有很多看起來像空白但不是空白的特殊字元。(參考:HTML Unicode UTF-8)

【心得】

  1. 下回遇到看不出任何異樣卻回報有錯的 config、XML、程式碼,不要只用眼睛檢查,應先以工具排除假空白及隱形字元陷阱。
  2. 想讓討厭的程式設計師同事發瘋,不用紮稻草人下降頭,偷偷在他的程式碼裡加點料就可以了。

A weird case when web.config contains invisible   chars.


Comments

Be the first to post a comment

Post a comment