2010-04-02 63 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