替换字符串中的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();
如果您尝试打印字符串,您会注意到它被移除的空间