2010-04-02 65 views
4

我想用this方法来创建用户友好的URL。因为我的网站是克罗地亚语,所以有些字符我不想去掉,但用另一个替换。富勒例如,这个字符串:
ŠĐĆŽšđčćž
需求是: sdccz-sdccz

所以,我想提出两个数组,一个将包含将被替换和其他阵列替换字符的字符:
字符串在C中替换变音符号#

string[] character = { "Š", "Đ", "Č", "Ć", "Ž", "š", "đ", "č", "ć", "ž" }; 
string[] characterReplace = { "s", "d", "c", "c", "z", "s", "d", "c", "c", "z" }; 

最后,这两个数组应该是一些方法,将采取字符串,找到匹配和替换它们的使用。在PHP中,我使用preg_replace函数来处理这个问题。在C#这不工作:

s = Regex.Replace(s, character, characterReplace); 


希望如果有人可以帮助。 谢谢

+4

查看http://stackoverflow.com/questions/2393887/how-to-replace-special-characters-with-their-equivalent-such-as-a-for-a – 2010-04-02 13:16:18

+0

@ile请参阅编辑我的答案! – 2010-04-02 13:48:47

回答

11

看来你想剥离变音符号并留下基本字符。我建议Ben Lings's solution这里这样的:

string input = "ŠĐĆŽ šđčćž"; 
string decomposed = input.Normalize(NormalizationForm.FormD); 
char[] filtered = decomposed 
    .Where(c => char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark) 
    .ToArray(); 
string newString = new String(filtered); 

编辑:小问题!它不适用于Đ。其结果是:

SĐCZ sđccz 
+0

我得到以下错误:'string'不包含'Normalize'的定义,并且没有找到接受'string'类型的第一个参数的扩展方法'Normalize'(你是否缺少using指令或程序集引用?) – 2010-04-02 13:24:11

+0

@ile:显然,我从中复制了该解决方案中的错误。我现在修好了。不幸的是,虽然这种方法不适用于Đ,所以要么你必须特别处理这种情况,要么按照你最初的建议来处理。 – 2010-04-02 13:25:55

+0

我看到...但这是非常简单的解决方案,我将使用此方法并使用特殊方法替换Đ和đ。谢谢! – 2010-04-02 13:30:08

10

乔恩斯基特mentioned the following code on a newsgroup ......

static string RemoveAccents (string input) 
{ 
    string normalized = input.Normalize(NormalizationForm.FormKD); 
    Encoding removal = Encoding.GetEncoding(Encoding.ASCII.CodePage, 
              new EncoderReplacementFallback(""), 
              new DecoderReplacementFallback("")); 
    byte[] bytes = removal.GetBytes(normalized); 
    return Encoding.ASCII.GetString(bytes); 
} 

编辑

也许我疯了,但我只是跑下面...

Dim Input As String = "ŠĐĆŽ-šđčćž" 
Dim Builder As New StringBuilder() 

For Each Chr As Char In Input 
    Builder.Append(Chr) 
Next 

Console.Write(Builder.ToString()) 

输出结果为SDCZ-sdccz

+0

这将完全删除©。 – 2010-04-02 13:27:06

+0

@Mark你是对的,但看到我的编辑,这有点令人难以置信 – 2010-04-02 13:47:51

+0

嗯我试着在本地VB.NET代码,我得到原来的字符串。 – 2010-04-02 14:03:57

0

字典将是对这一逻辑的解决方案......

Dictionary<char, char> AccentEquivelants = new Dictionary<char, char>(); 
AccentEquivelants.Add('Š', 's'); 
//...add other equivelents 

string inputstring = ""; 
StringBuilder FixedString = new StringBuilder(inputstring); 
for (int i = 0; i < FixedString.Length; i++) 
    if (AccentEquivelants.ContainsKey(FixedString[i])) 
     FixedString[i] = AccentEquivelants[FixedString[i]]; 
return FixedString.ToString(); 

你需要做的,当字符串操作喜欢这样,因为在C#中的字符串是不可改变的,在一个时间,所以改变字符来使用StringBuilder会在内存中创建多个字符串对象,而StringBuilders是可变的,并没有这个缺点。

+0

但字符数组不是。创建一个字符数组并修改其中的值。 – 2010-04-02 13:45:44