2014年1月9日 星期四

C# String.Trim() 刪除空白字元


在程式開發時,都會遇到一個這樣的問題,在字串的處理上,遇到了像空白字元,例如出現了這樣A potentially dangerous Request.Path value was detected from the client (:) 的錯誤訊息,是像 Unicode 的不可見字元 (U+200B),導致網址錯誤,瀏覽器無法解析該網址。String.Trim() 有可以處理像這樣問題的特性。

在 Thai (泰文)、Khmer (高棉文) 與 Myanmar (緬甸文) 語系中,預設輸入空白時,就是用 U+200B 這個字元做文字間格的(在他們的鍵盤配置裡預設就是這樣)。

在 .NET Framework 3.5 SP1 與先前的版本,String.Trim() 方法在不傳入參數或傳入空陣列的時候,在內部會維護一份「空白字元」的清單,在移除空白字元時會包含 ZERO WIDTH SPACE (U+200B) 與 ZERO WIDTH NO-BREAK SPACE (U+FEFF) 字元。但從 .NET Framework 4.0 以後版本,變更為判斷Char.IsWhiteSpace() 方法的回傳結果,如果回傳為 true 才會清除該空白字元,不過這兩個字元在 Char.IsWhiteSpace() 方法的回傳結果卻為 false,也代表使用String.Trim() 方法時,不會刪除這兩個字元。

如果要刪除這兩個字元,會用以下解法:
先刪除 Char.IsWhiteSpace() 方法認得的空白字元,再刪除這兩個字元。
var result = str.Trim().Trim(new char[] { '\uFEFF', '\u200B' });
先刪除這兩個字元,再刪除 Char.IsWhiteSpace() 方法認得的空白字元。
var result = str.Trim(new char[] { '\uFEFF', '\u200B' }).Trim();
僅刪除空白字元與這兩個字元 ( 不含 Unicode 空白字元與 ASCII 控制字元 )。
var result = str.Trim(new char[] { '\uFEFF', '\u200B', ' ' });
最後依據 MSDN 文件所列出的空白字元清單加上本文提到的兩個空白字元的完整版本。
char[] all_whitespaces = new char[] {
    // SpaceSeparator category
    '\u0020', '\u1680', '\u180E', '\u2000', '\u2001', '\u2002', '\u2003',
    '\u2004', '\u2005', '\u2006', '\u2007', '\u2008', '\u2009', '\u200A',
    '\u202F', '\u205F', '\u3000',
    // LineSeparator category
    '\u2028',
    // ParagraphSeparator category
    '\u2029',
    // Latin1 characters
    '\u0009', '\u000A', '\u000B', '\u000C', '\u000D', '\u0085', '\u00A0',
    // ZERO WIDTH SPACE (U+200B) & ZERO WIDTH NO-BREAK SPACE (U+FEFF)
    '\u200B', '\uFEFF'
};
var result = str.Trim(all_whitespaces);
-雲遊山水為知已逍遙一生而忘齡- 電腦神手

沒有留言:

張貼留言