6

我正在运行一个控制台应用程序(myApp.exe),它将伪本地化(unicode)字符串输出到标准输出。如果我在常规命令提示符 (cmd.exe) 中运行它,则 unicode 数据会丢失。如果我在 unicode 命令提示符(cmd.exe /u)中运行它或将控制台的属性设置为“Lucida Console”,那么将保留 unicode 字符串。

我想在 C# 中运行这个应用程序并将 unicode 字符串重定向到一个局部变量中。我正在使用 RedirectStandardOutput = true 的 Process 对象,但 unicode 字符串总是丢失。

如何指定保留此 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;
        } 
4

3 回答 3

3

看起来您需要使用ProcessStartInfo 上的StandardOutputEncoding属性从控制台应用程序更改 StandardOutput 流的编码。在开始该过程之前,尝试在 try/catch 块中添加以下代码:

process.StartInfo.StandardOutputEncoding = Encoding.Unicode;

您可能必须尝试不同的编码,才能确定哪种编码适合您的情况。

于 2008-10-16T01:28:30.347 回答
2

取出字节,看看它们是否有意义:

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

一旦确定了实际编码,您就可以使用标准编码 API将字节转换为字符串。

于 2010-01-14T20:17:50.530 回答
0

第一套process.StartInfo.StandardOutputEncoding = Encoding.Default

然后转到Control Panel> Region> Administrative>Change system locale...并在那里设置伪本地化字符串的编码。

于 2020-03-08T09:59:43.903 回答