我们有一个文本文件,其中包含以下文字
"\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);
返回错误的输出。
请帮我解决问题。
答案 0 :(得分:6)
使用下面的代码,它会从输入字符串
中转义任何转义字符Regex.Unescape(value);
答案 1 :(得分: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"));
答案 2 :(得分: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利用答案可能更快,但我碰巧有这个代码。 :)答案 3 :(得分:0)
UTFEncoding
(或任何其他编码)不会将\u5b89
之类的转义序列转换为相应的字符。
传递字符串常量时它的工作原理是C#编译器在调用解码器之前解释转义序列并将它们转换为相应的字符(实际上甚至在程序执行之前......)。
您必须编写识别转义序列的代码并将其转换为相应的字符。
答案 4 :(得分:0)
当您阅读"\u5b89\u5fbd\u5b5f\u5143"
时,您会得到您所读到的内容。调试器在显示之前会转义字符串。字符串中的双反斜杠实际上是已经转义的单反斜杠。
当你传递硬编码值时,你实际上并没有传递你在屏幕上看到的内容。您传递了四个Unicode字符,因为C#字符串未被编译器转义。
Darin已经发布了一种从文件中转换Unicode字符的方法,所以我不再重复了。
答案 5 :(得分:-1)
我认为这会给你一些想法。
string str = "ivandro\u0020";
str = str.Trim();
如果您尝试打印字符串,您会注意到它被移除的空间