2012-03-16 102 views
4

我們必須具有以下文本替換字符串中的Unicode轉義序列

"\u5b89\u5fbd\u5b5f\u5143" 

當我們讀到在C#中的文件CON污點.NET它顯示像

"\\u5b89\\u5fbd\\u5b5f\\u5143" 

我們的解碼器一個文本文件方法是

public string Decoder(string value) 
     { 
      Encoding enc = new UTF8Encoding(); 
      byte[] bytes = enc.GetBytes(value); 
      return enc.GetString(bytes); 
     } 

當我通過硬編碼值

string Output=Decoder("\u5b89\u5fbd\u5b5f\u5143"); 

它工作的很好,但是當我們使用變量值的時候它不工作。

當我們使用字符串我們從文本文件中獲取

value=(text file containt) 
    string Output=Decoder(value); 

它返回錯誤的輸出。

請幫我解決問題。

回答

5

你可以正則表達式來解析文件:

private static Regex _regex = new Regex(@"\\u(?<Value>[a-zA-Z0-9]{4})", RegexOptions.Compiled); 
public string Decoder(string value) 
{ 
    return _regex.Replace(
     value, 
     m => ((char)int.Parse(m.Groups["Value"].Value, NumberStyles.HexNumber)).ToString() 
    ); 
} 

然後:

string data = Decoder(File.ReadAllText("test.txt")); 
+0

首先,當我使用此代碼我收到編譯錯誤的空間。 1 \t無法將lambda表達式轉換爲類型'string',因爲它不是委託錯誤。 名稱'NumberStyles'在當前上下文中不存在 – PrateekSaluja 2012-03-16 14:14:04

+0

您能否告訴我我犯了什麼錯誤? – PrateekSaluja 2012-03-16 14:15:33

+0

您正在使用哪個.NET版本? 'NumberStyles'枚舉是在System.Globalization命名空間中定義的,因此請確保您引用了它。 – 2012-03-16 14:16:18

0

UTFEncoding(或任何其他編碼)不會將諸如\u5b89的轉義序列轉換爲相應的字符。

傳遞字符串常量的原因是,C#編譯器在調用解碼器之前(實際上甚至在執行程序之前)正在解釋轉義序列並將其轉換爲相應的字符。

您必須編寫識別轉義序列的代碼並將它們轉換爲相應的字符。

3

所以你的文件包含逐字字符串

\u5b89\u5fbd\u5b5f\u5143 

在ASCII而不是串在某些給定的編碼中由這四個Unicode碼點表示?

碰巧,我只是寫在C#中的一些代碼,可以解析字符串格式爲a JSON parser project - 這裏是只處理爲\ uXXXX逃逸變體:

private static string ReadSlashedString(TextReader reader) { 
    var sb = new StringBuilder(32); 
    bool q = false; 
    while (true) { 
     int chrR = reader.Read(); 

     if (chrR == -1) break; 
     var chr = (char) chrR; 

     if (!q) { 
      if (chr == '\\') { 
       q = true; 
       continue; 
      } 
      sb.Append(chr); 
     } 
     else { 
      switch (chr) { 
       case 'u': 
       case 'U': 
        var hexb = new char[4]; 
        reader.Read(hexb, 0, 4); 
        chr = (char) Convert.ToInt32(new string(hexb), 16); 
        sb.Append(chr); 
        break; 
       default: 
        throw new Exception("Invalid backslash escape (\\ + charcode " + (int) chr + ")"); 
      } 
      q = false; 
     } 
    } 
    return sb.ToString(); 
} 

,你可以使用它像

var str = ReadSlashedString(new StringReader("\\u5b89\\u5fbd\\u5b5f\\u5143")); 

(或使用StreamReader從文件讀取)。

希望這會有所幫助!

編輯:@Darin Dimitrov的regexp利用答案可能更快,但我碰巧有這個代碼在手邊。:)

+0

感謝它的工作,我嘗試了達林的代碼,但得到了一些編譯問題。任何方式非常感謝這個代碼。 – PrateekSaluja 2012-03-16 14:19:09

+0

非常感謝你..我最後一天很掙扎。現在我明白了......再次感謝 – PrabhuPrakash 2017-11-23 14:34:40

0

當你正在閱讀"\u5b89\u5fbd\u5b5f\u5143"時,你會得到你閱讀的內容。調試器在顯示它們之前轉義您的字符串。字符串中的雙反斜槓實際上是單個反斜槓,已經逃脫。

當您傳遞硬編碼值時,實際上並沒有傳遞您在屏幕上看到的內容。由於C#字符串由編譯器未轉義,因此您將傳入四個Unicode字符。

達林已經發布了一個方法來從文件中忽略Unicode字符,所以我不會重複。下面的代碼

2

使用該取消轉義從輸入字符串

Regex.Unescape(value); 
-1

任何esapces字符內,我認爲這會給你一些想法。

string str = "ivandro\u0020"; 
    str = str.Trim(); 

如果您嘗試打印字符串,你會發現,這是\ u0020它刪除了所有感謝您的回覆的