Convertir una cadena Unicode en una cadena ASCII con escape

Resuelto Ali asked hace 14 años • 9 respuestas

¿Cómo puedo convertir esta cadena?

This string contains the Unicode character Pi(π)

en una cadena ASCII con escape:

This string contains the Unicode character Pi(\u03a0)

y viceversa ?

La codificación actual disponible en C# convierte el carácter π en "?". Necesito preservar ese carácter.

Ali avatar Oct 24 '09 02:10 Ali
Aceptado

Esto va y viene desde y hacia el formato \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();
            } );
    }
}

Salidas:

Esta función contiene un carácter Unicode pi (π)

Esta función contiene un carácter Unicode pi (\u03a0)

Esta función contiene un carácter Unicode pi (π)

Adam Sills avatar Oct 23 '2009 20:10 Adam Sills

Para Unescape simplemente puedes usar estas funciones:

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

System.Uri.UnescapeDataString(string)

Sugiero usar este método (funciona mejor con UTF-8):

UnescapeDataString(string)
MrRolling avatar Jul 11 '2015 21:07 MrRolling
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);
}
leppie avatar Oct 23 '2009 20:10 leppie

Como una sola línea:

var result = Regex.Replace(input, @"[^\x00-\x7F]", c => 
    string.Format(@"\u{0:x4}", (int)c.Value[0]));
Douglas avatar Aug 17 '2014 14:08 Douglas