2011-07-16 90 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