将Unicode字符串转换为转义的ASCII字符串

Ali*_*Ali 75 c# unicode encoding

我该如何转换这个字符串:

This string contains the Unicode character Pi(?)
Run Code Online (Sandbox Code Playgroud)

转换为转义的ASCII字符串:

This string contains the Unicode character Pi(\u03a0)
Run Code Online (Sandbox Code Playgroud)

反之亦然

C#中可用的当前编码将π字符转换为"?".我需要保留那个角色.

Ada*_*lls 130

这往返于\ uXXXX格式.

class Program {
    static void Main( string[] args ) {
        string unicodeString = "This function contains a unicode character pi (\u03a0)";

        Console.WriteLine( unicodeString );

        string encoded = EncodeNonAsciiCharacters(unicodeString);
        Console.WriteLine( encoded );

        string decoded = DecodeEncodedNonAsciiCharacters( encoded );
        Console.WriteLine( decoded );
    }

    static string EncodeNonAsciiCharacters( string value ) {
        StringBuilder sb = new StringBuilder();
        foreach( char c in value ) {
            if( c > 127 ) {
                // This character is too big for ASCII
                string encodedValue = "\\u" + ((int) c).ToString( "x4" );
                sb.Append( encodedValue );
            }
            else {
                sb.Append( c );
            }
        }
        return sb.ToString();
    }

    static string DecodeEncodedNonAsciiCharacters( string value ) {
        return Regex.Replace(
            value,
            @"\\u(?<Value>[a-zA-Z0-9]{4})",
            m => {
                return ((char) int.Parse( m.Groups["Value"].Value, NumberStyles.HexNumber )).ToString();
            } );
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

该函数包含一个unicode字符pi(π)

此函数包含一个unicode字符pi(\ u03a0)

该函数包含一个unicode字符pi(π)

  • \用户不应该匹配,因为你之后没有4个字符,但我明白你的观点.只需将匹配的正则表达式字符更改为[a-fA-F0-9]即可.它仍然会匹配它不打算匹配的东西,但它似乎仍然符合原始问题的意图. (3认同)
  • @AdamSills如果第三方服务器返回它们,则需要解码.如果要转换这些字符,静态方法在Net或Web类中会很好. (3认同)
  • 看起来很干净.尽管如此,我很惊讶没有System .Net类可以做到这一点. (2认同)

MrR*_*ing 19

对于Unescape您可以简单地使用此功能:

System.Text.RegularExpressions.Regex.Unescape(string)

System.Uri.UnescapeDataString(string)
Run Code Online (Sandbox Code Playgroud)

我建议使用这种方法(它适用于UTF-8):

UnescapeDataString(string)
Run Code Online (Sandbox Code Playgroud)

  • 在我使用“System.Text.RegularExpressions.Regex.Unescape”的情况下,我得到了更好的结果。 (2认同)

lep*_*pie 11

string StringFold(string input, Func<char, string> proc)
{
  return string.Concat(input.Select(proc).ToArray());
}

string FoldProc(char input)
{
  if (input >= 128)
  {
    return string.Format(@"\u{0:x4}", (int)input);
  }
  return input.ToString();
}

string EscapeToAscii(string input)
{
  return StringFold(input, FoldProc);
}
Run Code Online (Sandbox Code Playgroud)

  • 任何不涉及正则表达式的东西都有我的投票. (2认同)