6

標準出力に疑似ローカライズ (Unicode) 文字列を出力するコンソール アプリ (myApp.exe) を実行しています。これを通常のコマンド プロンプト (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 に答える