2008-10-15 5 views
5

Estoy ejecutando una aplicación de consola (myApp.exe) que genera una cadena pseudo localizada (unicode) en la salida estándar. Si ejecuto esto en un símbolo del sistema normal (cmd.exe), los datos Unicode se pierden. Si ejecuto esto en un símbolo del sistema Unicode (cmd.exe/u) o establezco las propiedades de la consola en "Consola Lucida", se mantiene la cadena Unicode.Reorientando ConsoleOutput que contiene cadenas pseudo-loc (unicode) en C#

Me gustaría ejecutar esta aplicación en C# y redirigir la cadena Unicode en una variable local. Estoy usando un objeto Process con RedirectStandardOutput = true, pero la cadena Unicode siempre se pierde.

¿Cómo puedo especificar que se mantenga esta información Unicode?

 private static int RunDISM(string Args, out string ConsoleOutput) 
     { 
      Process process = new Process(); 
      process.StartInfo.FileName = "myApp.exe"; 
      process.StartInfo.Arguments = Args; 

      try 
      { 
       process.StartInfo.CreateNoWindow = true; 
       process.StartInfo.UseShellExecute = false; 
       process.StartInfo.RedirectStandardOutput = true; 
       process.StartInfo.WorkingDirectory = Environment.CurrentDirectory; 

       process.Start(); 
       process.WaitForExit(Int32.MaxValue); 
      } 
      catch (Exception e) 
      { 
       WEX.Logging.Interop.Log.Assert("Failure while starting or running process.\nERROR: " + e.Message); 
       ConsoleOutput = null; 
       return EXITCODE_ERROR; 
      } 

      ConsoleOutput = process.StandardOutput.ReadToEnd(); 
      return process.ExitCode; 
     } 
+0

¿Puede proporcionarnos más detalles sobre el contenido de Unicode que está tratando de obtener de myApp.exe, particularmente una cadena de muestra que no se procesa correctamente? Eso podría ayudarnos a llegar a una solución de trabajo. – Charlie

+0

En otra nota: debe llamar a ReadToEnd() ANTES de WaitToExit(). Ver: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx – Ben

Respuesta

3

Parece que es necesario cambiar la codificación de la corriente StandardOutput de su aplicación de consola, utilizando la propiedad StandardOutputEncoding en ProcessStartInfo. Trate de añadir el siguiente código dentro de su bloque try/catch, antes de iniciar el proceso:

process.StartInfo.StandardOutputEncoding = Encoding.Unicode; 

Es posible que tenga que experimentar con diferentes codificaciones para ver cuál es el más adecuado para su caso.

+1

He intentado todas las codificaciones y los datos siempre se pierden o tergiversan. :( – Kenn

+0

¿No te refieres a StandardInputEncoding? Si myApp.exe está emitiendo "Unicode" (lo que eso signifique en este contexto), entonces es la aplicación que ejecuta myApp.exe la que debe intentar analizarlo correctamente. – bzlm

+0

La manera de pensar es que StandardOutput es una secuencia de la que la aplicación C# va a leer. Esta secuencia contiene los datos que myApp escribe en su propio stdout. Dado que los datos estarán en forma unicode, la secuencia necesita su codificación en consecuencia. – Charlie

2

Obtener los bytes y ver si tienen ningún sentido:

var b = p.StandardOutput.CurrentEncoding.GetBytes(p.StandardOutput.ReadToEnd()); 

Una vez que descubierto la codificación real se puede utilizar el standard encoding APIs para convertir los bytes en una cadena.

Cuestiones relacionadas