替换字符串中的unicode转义序列

我们有一个文本文件,其中包含以下文本

"\u5b89\u5fbd\u5b5f\u5143" 

当我们在c#.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); 

它返回错误的输出。

请帮我解决这个问题。

您可以使用正则表达式来解析文件:

 private static Regex _regex = new Regex(@"\\u(?[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")); 

使用下面的代码,unescapes输入字符串中的任何esapces字符

 Regex.Unescape(value); 

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

 \u5b89\u5fbd\u5b5f\u5143 

在ASCII中,而不是某些给定编码中由这四个Unicode代码点表示的字符串?

实际上,我只是在C#中编写了一些代码,可以解析JSON解析器项目的这种格式的字符串 – 这里只是处理\ 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利用答案可能更快,但我碰巧有这个代码。 🙂

UTFEncoding (或任何其他编码)不会将\u5b89类的转义序列转换为相应的字符。

传递字符串常量时它起作用的原因是C#编译器在调用解码器之前解释转义序列并将它们转换为相应的字符(实际上甚至在程序执行之前……)。

您必须编写可识别转义序列的代码并将其转换为相应的字符。

当您阅读"\u5b89\u5fbd\u5b5f\u5143"您会得到您所读到的内容。 调试器在显示之前会转义字符串。 字符串中的双反斜杠实际上是已经转义的单反斜杠。

当你传递硬编码值时,你实际上并没有传递你在屏幕上看到的内容。 您传递了四个Unicode字符,因为C#字符串未被编译器取消。

Darin已经发布了一种从文件中取消Unicode字符的方法,所以我不再重复了。

我想这会给你一些想法。

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

如果您尝试打印字符串,您会注意到它被移除的空间