Sostituisci sequenze di escape unicode in una stringa

Abbiamo un file di testo che ha il seguente testo

"\u5b89\u5fbd\u5b5f\u5143" 

Quando leggiamo un file con taint in c # .net mostra come

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

Il nostro metodo di decodifica è

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

Quando passo il valore del codice

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

funziona bene ma quando usiamo il valore variabile, quel tempo non funziona.

Quando usiamo la stringa ciò che otteniamo dal file di testo

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

Restituisce Output errato.

Per favore aiutami a risolvere il problema.

È ansible regolare l’espressione per analizzare il file:

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

e poi:

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

Usa sotto il codice questo rimuove qualsiasi carattere di esapces dalla stringa Input

 Regex.Unescape(value); 

Quindi il tuo file contiene la stringa testuale

 \u5b89\u5fbd\u5b5f\u5143 

in ASCII e non la stringa rappresentata da quei quattro codepoint Unicode in una determinata codifica?

Come succede, ho appena scritto un codice in C # che può analizzare stringhe in questo formato per un progetto parser JSON – ecco una variante che gestisce solo gli escape di \ 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(); } 

e potresti usarlo come

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

(o usando uno StreamReader per leggere da un file).

Spero che questo ti aiuti!

EDIT: @Darin Dimitrov’s regexp-risposta di risposta è probabilmente più veloce, ma mi è capitato di avere questo codice a portata di mano. 🙂

UTFEncoding (o qualsiasi altra codifica) non tradurrà sequenze di escape come \u5b89 nel carattere corrispondente.

Il motivo per cui funziona quando si passa una costante di stringa è che il compilatore C # interpreta le sequenze di escape e le traduce nel carattere corrispondente prima di chiamare il decodificatore (in realtà anche prima che il programma venga eseguito …).

Devi scrivere codice che riconosca le sequenze di escape e convertirle nei caratteri corrispondenti.

Quando leggi "\u5b89\u5fbd\u5b5f\u5143" ottieni esattamente ciò che leggi. Il debugger esegue l’escape delle stringhe prima di visualizzarle. I doppi backslash nella stringa sono in realtà singoli backslash che sono stati sfuggiti.

Quando si passa il valore di hardcoded, in realtà non si passa in quello che si vede sullo schermo. Stai passando in quattro caratteri Unicode, poiché la stringa C # non viene decodificata dal compilatore.

Darin ha già pubblicato un modo per scansionare i caratteri Unicode dal file, quindi non lo ripeterò.

Penso che questo ti darà un’idea.

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

Se provi a stampare la stringa, noterai che lo spazio che è stato rimosso