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

时间:2012-03-16 13:37:40

标签: c# .net

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

"\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);

返回错误的输出。

请帮我解决问题。

6 个答案:

答案 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();

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