命令行-重定向C#中包含伪loc(unicode)字符串的ConsoleOutput

本文关键字:unicode 字符串 ConsoleOutput loc 重定向 包含伪 命令行 | 更新日期: 2023-09-27 17:47:47

我正在运行一个控制台应用程序(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;
        } 

命令行-重定向C#中包含伪loc(unicode)字符串的ConsoleOutput

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

process.StartInfo.StandardOutputEncoding = Encoding.Unicode;

你可能需要尝试不同的编码,看看哪种编码适合你的情况。

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

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

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

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

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