0

我使用控制台程序(cmd 调用)将标准输入中的字符串转换为从标准输出接收到的特殊 Unicode 字符字符串。C# 中的返回字符串转义了 Unicode 字符之前的转义反斜杠。

如何撤消这种转义?

示例返回字符串 =

stdout = "\\x284b\\x2817\\x2801\\x281d\\x2835 \\x281a\\x2801\\x281b\\x281e \\x280a\\x280d \\x2805\\x2815\\x280d\\x280f\\x2807\\x2811\\x281e\\x281e \\x2827\\x2811\\x2817\\x283a\\x2801\\x2813\\x2817\\x2807\\x2815\\x280e\\x281e\\x2811\\x281d \\x285e\\x2801\\x282d"

...但它应该是

stdout = "\x284b\x2817\x2801\x281d\x2835 \x281a\x2801\x281b\x281e \x280a\x280d \x2805\x2815\x280d\x280f\x2807\x2811\x281e\x281e \x2827\x2811\x2817\x283a\x2801\x2813\x2817\x2807\x2815\x280e\x281e\x2811\x281d \x285e\x2801\x282d"

我试图通过这样做来解决这个问题

var stdout2 = stdout.Replace(@"\\", @"\");

没有效果。

感谢 4 帮助。

4

4 回答 4

0

你需要做

stdout = stdout.Replace(@"\\", @"\");

反而。

于 2014-02-04T12:51:57.653 回答
0

我假设您不想\\在字符串中删除。它应该打印为\\x284b.... 如果是这种情况,则将字符串附加到@. 以下代码将打印\\

       string stdout = @"\\x284b\\x2817\\x2801\\x281d\\x2835 \\x281a\\x2801\\x281b\\x281e
       \\x280a\\x280d \\x2805\\x2815\\x280d\\x280f\\x2807\\x2811\\x281e\\x281e   
       \\x2827\\x2811\\x2817\\x283a\\x2801\\x2813\\x2817\\x2807\\x2815\\x280e\\x281e\\x2811
        \\x281d \\x285e\\x2801\\x282d";

        Console.Write(stdout);
        Console.Read();
于 2014-02-04T14:28:11.623 回答
0

结果来自一个名为 liblouis 的控制台程序

好吧,LibLouis 有自己奇怪的非标准字符串转义方案,记录在此处的第 3 节中。如果你想把它变成一个原始的未转义的 Unicode 字符串,除了\x. 类似的东西(未测试):

var escape = new Regex(@"\\(x[0-9A-Fa-f]{4}|y[0-9A-Fa-f]{5}|z[0-9A-Fa-f]{8}|.)");
var chars = new Dictionary<char, string> {
    { 'f', "\f" }, { 'n', "\n" }, { 'r', "\r" }, { 't', "\t" }, { 'v', "\v" },
    { 's', " " }, { 'e', "\x1B"}
};

var decoded_string = escape.Replace(encoded_string, match =>
    match.Length>2 ?
        Char.ConvertFromUtf32(
            int.Parse(
                match.Value.Substring(2),
                System.Globalization.NumberStyles.HexNumber
            )
        ) :
    chars.ContainsKey(match.Value[1]) ?
        chars[match.Value[1]] :
    match.Value.Substring(1)
);
于 2014-02-11T17:14:34.913 回答
0

最后,它既简单又有点复杂。我知道 achar可以从integer. 因此,通过知道,样式“ \x284b ”的编码表示十六进制值“ 284B ”,即十进制的“ 10315 ”,因此可以转换为char. 所以我使用这些小函数将编码转换为一个Int32,然后将其转换为一个内部string......瞧

/// <summary>
/// Gets the char from unicode hexadecimal string.
/// </summary>
/// <param name="characterCode">The character code e.g. '\x2800'.</param>
/// <returns>the current available unicode character if available e.g. ' '</returns>
public static string GetCharFromUnicodeHex(String characterCode)
{

    if (!String.IsNullOrEmpty(characterCode))
    {
        if (characterCode.StartsWith(@"\"))
        {
            characterCode = characterCode.Substring(1);
        }
        if (characterCode.StartsWith("x"))
        {
            characterCode = characterCode.Substring(1);
        }

        int number;
        bool success = Int32.TryParse(characterCode, System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture, out number);

        if (success)
        {
            return GetCharFromUnicodeInt(number);
        }
    }
    return String.Empty;
}


/// <summary>
/// try to parse a char from unicode int.
/// </summary>
/// <param name="number">The number code e.g. 10241.</param>
/// <returns>the char of the given value e.g. ' '</returns>
public static string GetCharFromUnicodeInt(int number)
{
    try
    {
        char c2 = (char)number;
        return c2.ToString();
    }
    catch { }
    return String.Empty;
}
于 2014-12-17T13:41:10.857 回答