2011-07-16 70 views
2

我正在嘗試淨化字符串,以便它可以用於放入URL中。這僅用於在網址中顯示。現在,我使用的PHP這個函數工作得很好:將字符串淨化爲url安全格式

$CleanString = IconV('UTF-8', 'ASCII//TRANSLIT//IGNORE', $String); 
$CleanString = Preg_Replace("/[^a-zA-Z0-9\/_|+ -]/", '', $CleanString); 
$CleanString = StrToLower(Trim($CleanString, '-')); 
$CleanString = Preg_Replace("/[\/_|+ -]+/", $Delimiter, $CleanString); 

現在我試圖把這個在C#中,正則表達式的都沒有問題,但第一行是有點棘手。將字符替換爲正常等同字符的安全方法是什麼?

例如,上面會transer:

The cát ís running & getting away 

the-cat-is-running-getting-away 
+2

退房:http://meta.stackexchange.com/questions/7435/non-us-ascii-characters-dropped-from-full-profile -url/7696#7696 – Magnus

+0

謝謝!這將會訣竅 – YesMan85

回答

3

CharUnicodeInfo.GetUnicodeCategory(c)方法可以告訴你,如果一個字符是一個 「非間距標記」。只有當字符串的形式爲重音(「diacritics」)與其字母分開時才能使用,可以使用Normalize(NormalizationForm.FormD)來獲得。

以下是完整的字符串擴展方法:

using System.Text; 
using System.Globalization; 
... 

public static string RemoveDiacritics(this string strThis) 
{ 
    if (strThis == null) 
     return null; 

    var sb = new StringBuilder(); 

    foreach (char c in strThis.Normalize(NormalizationForm.FormD)) 
    { 
     if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) 
      sb.Append(c); 
    } 
    return sb.ToString(); 
} 
+0

這是一個很好的解決方案。但是,您可能會根據您的需要對其進行改進,方法是在foreach塊中添加對「UnicodeCategory.OtherPunctuation」的檢查。這將刪除那些可能導致IIS拋出錯誤的令人討厭的',逗號,額外破折號等。但是如果你使用它,不要忘了在返回值時通過返回sb.ToString()。替換(「」,「」)或類似的東西來替換雙空格。 – VadimG