Reemplazar secuencias de escape unicode en una cadena

Tenemos un archivo de texto que tiene un texto siguiente

"\u5b89\u5fbd\u5b5f\u5143" 

Cuando leemos una información de archivo en c # .net, se muestra como

 "\\u5b89\\u5fbd\\u5b5f\\u5143" 

Nuestro método de deencoding es

 public string Decoder(string value) { Encoding enc = new UTF8Encoding(); byte[] bytes = enc.GetBytes(value); return enc.GetString(bytes); } 

Cuando paso el valor del Código

 string Output=Decoder("\u5b89\u5fbd\u5b5f\u5143"); 

funciona bien, pero cuando usamos el valor de la variable ese tiempo, no está funcionando.

Cuando usamos la cadena lo que obtenemos del archivo de texto

  value=(text file containt) string Output=Decoder(value); 

Devuelve una salida incorrecta.

Por favor, ayúdame a resolver el problema.

Puede regular la expresión para analizar el archivo:

 private static Regex _regex = new Regex(@"\\u(?[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() ); } 

y entonces:

 string data = Decoder(File.ReadAllText("test.txt")); 

Use el código a continuación para desaprender cualquier charap de esapces de la cadena de Entrada

 Regex.Unescape(value); 

Entonces su archivo contiene la cadena literal

 \u5b89\u5fbd\u5b5f\u5143 

en ASCII y no la cadena representada por esos cuatro puntos de código Unicode en alguna encoding dada?

Da la casualidad, acabo de escribir un código en C # que puede analizar cadenas en este formato para un proyecto de analizador JSON ; aquí hay una variante que solo maneja \ uXXXX escapes:

 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(); } 

y podrías usarlo como

 var str = ReadSlashedString(new StringReader("\\u5b89\\u5fbd\\u5b5f\\u5143")); 

(o usando un StreamReader para leer desde un archivo).

¡Espero que esto ayude!

EDITAR: la respuesta de utilización de expresiones regulares de @Darin Dimitrov es probablemente más rápida, pero tuve este código a mano. 🙂

UTFEncoding (o cualquier otra encoding) no traducirá secuencias de escape como \u5b89 en el carácter correspondiente.

La razón por la que funciona cuando se pasa una constante de cadena es que el comstackdor de C # interpreta las secuencias de escape y las traduce en el carácter correspondiente antes de llamar al decodificador (en realidad, incluso antes de que se ejecute el progtwig …).

Debe escribir un código que reconozca las secuencias de escape y las convierta en los caracteres correspondientes.

Cuando lee "\u5b89\u5fbd\u5b5f\u5143" obtiene exactamente lo que lee. El depurador escapa de sus cadenas antes de mostrarlas. Las barras diagonales inversas dobles en la cadena son en realidad barras invertidas únicas que se han escapado.

Cuando le pasa el valor codificado, en realidad no está transmitiendo lo que ve en la pantalla. Está transfiriendo cuatro caracteres Unicode, ya que el comstackdor no guarda la cadena C #.

Darin ya ha publicado una forma de deshacer los caracteres Unicode del archivo, por lo que no lo repetiré.

Creo que esto te dará una idea.

  string str = "ivandro\u0020"; str = str.Trim(); 

Si intenta imprimir la cadena, notará que el espacio que está \ u0020 quitó