今天在調試一段代碼的時候,有一個輸入不能為空的庫函數拋出了異常(為空就會拋出異常,就是這么傲嬌)。自己暗罵了自己一番,怎么這么大意,於是追溯源頭,開始尋找輸入控制的地方。但是當我找到時我驚呆了,我明明寫了代碼來控制輸入不為空的啊!
if(!string.IsNullOrWhiteSpace(input))
Function(input);
我一度懷疑是我眼花了,於是回到案發現場,逐步調試。看到案發現場的那一刻我又吃了一驚,這玩意,你說不為空,真的不為空嗎...
我看着這個奇異的符號,心中頓時生出了無數怨念,難道它的長度還能不是0?借助VS,我們來看看它的屬性:
還真的是1...我倒要看看你究竟是何方神聖,於是我想到了ToArray函數,看看它能不能幫我抓出真凶。
看看我們捕捉到了什么? 經過一番查找,原來這貨是U+200B,它還有個學名,叫做:Zero Width Space。它經常出現於各大HTML網頁中,是一種看不見的分隔符。
但是要注意在C#中,我們使用string的判斷為空的方法是無法識別它的。那么如何規避它的影響呢? 其實只需要在預處理文本的時候加上一句:
text = text.Replace("\u200B","");
這樣就可以去掉text文本中的這種看不見的分隔符了。注意,U+200B有可能連續多個一起出現,所以盡量不要通過判斷長度和字符來尋找和去除它。