Перенаправление ConsoleOutput, содержащее строки псевдолокации (юникод) в C # - PullRequest
5 голосов
/ 16 октября 2008

Я запускаю консольное приложение (myApp.exe), которое выводит псевдо локализованную (Unicode) строку в стандартный вывод. Если я запускаю это в обычной командной строке (cmd.exe), данные Unicode теряются. Если я запускаю это в командной строке Unicode (cmd.exe / u) или задаю в свойствах консоли значение «Lucida Console», строка Unicode сохраняется.

Я бы хотел запустить это приложение на C # и перенаправить строку юникода в локальную переменную. Я использую объект Process с RedirectStandardOutput = true, но строка Юникода всегда теряется.

Как я могу указать, чтобы сохранить эту информацию 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;
        } 

Ответы [ 2 ]

3 голосов
/ 16 октября 2008

Похоже, вам нужно изменить кодировку потока StandardOutput из консольного приложения, используя свойство StandardOutputEncoding в ProcessStartInfo. Попробуйте добавить следующий код внутри блока try / catch, прежде чем начинать процесс:

process.StartInfo.StandardOutputEncoding = Encoding.Unicode;

Возможно, вам придется поэкспериментировать с различными кодировками, чтобы понять, какая из них подходит для вашего случая.

2 голосов
/ 14 января 2010

Выведите байты и посмотрите, имеют ли они смысл:

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

Как только вы выяснили фактическую кодировку, вы можете использовать стандартные API кодирования для преобразования байтов в строку.

...