2012-09-26 30 views
3

我有一個名爲Frédéric的聯繫人。如何刪除像Frédéric這樣的特殊字符?

當我在網站上搜索它的聯繫人列表中的名稱得到改變這樣"Frédéric",因爲它會搜索該名稱(Frédéric)在數據庫中我在它的名稱爲Frédéric

所以在數據庫中不會有這樣的名字,它表示沒有找到聯繫人。

我如何獲得除此名稱以外的真實姓名Frédéric。?

我的解碼方法是

public static string Decode(string text) 
     { 
      if (text == null) 
      { 
       return ""; 
      } 

      string result = ""; 
      string[] values = text.Split('@'); 
      bool escaped = false; 
      try 
      { 
       for (int i = 0; i < values.Length; i++) 
       { 
        if (!escaped) 
        { 
         result += values[i].Replace("_"," "); 
        } 
        else 
        { 
         //result += System.Text.ASCIIEncoding.ASCII.GetChars(new byte[] { byte.Parse(values[i]) })[0]; 

        } 
        escaped = !escaped; 
       } 
      } 
      catch { } 
      return result; 
     } 

這裏的方法的參數是FRA©DA©RIC但它實際上必須是弗雷德裏克。

回答

9

你在你的系統,其中,UTF-8編碼字符串使用解碼有錯誤的地方所謂的ANSI代碼頁。此代碼演示了錯誤:

var name = "Frédéric"; 
var bytes = Encoding.UTF8.GetBytes(name); 
var wrongName = Encoding.Default.GetString(bytes); 

現在wrongNameFrédéric

你需要做的是這樣的:

var name = "Frédéric"; 
var bytes = Encoding.UTF8.GetBytes(name); 
var correctName = Encoding.UTF8.GetString(bytes); 

Encoding.Default取決於您的Windows區域設置。在我的電腦上,代碼頁是Windows 1252,也被稱爲ISO 8859:1,但在世界其他地方它可能是另一個代碼頁。我相信日本的ANSI代碼頁是932,在這種情況下,錯誤的名稱將會出現爲Frテゥdテゥric

無論如何,要使用的正確編碼是UTF-8,因爲您的字符串使用該編碼進行編碼。試圖「修復」損壞的字符串並不是一條富有成效的路徑,因爲它取決於代碼執行的系統的ANSI代碼頁。

+0

原則上,他可以使用默認編碼來代替UTF-8,但這是一個非常糟糕的主意。 UTF-8顯然更好,因爲它避免了代碼頁的痛苦。 – CodesInChaos

+0

hi martin, 在我的解碼方法中,我做了這件事 result + = System.Text.ASCIIEncoding.ASCII.GetChars(new byte [] {byte.Parse(values [i])})[0]; – saaswathy

+0

@saaswathy:解碼字節需要使用編碼時使用的相同編碼。我已經證明,如果使用UTF-8進行編碼並使用ISO 8859:1進行解碼,您會得到'FrédÃric',這非常暗示您使用UTF-8進行編碼。這意味着你也必須使用UTF-8進行解碼。例如。調用'Encoding.UTF8.GetString'來解碼字節。不要'用ASCII編碼/解碼 - 'é'然後會映射到'?'。 –