ProcessStartInfoでは、子プロセスの標準ストリームで使用するエンコーディングを指定することができます。 子プロセスの標準ストリームが自プロセスとは異なるエンコーディングを使用しているなど、標準ストリームでのエンコーディングを指定する必要がある場合には、以下のプロパティで指定します。
StandardOutputEncoding/StandardErrorEncodingプロパティでは、標準出力・標準エラーで用いるエンコーディングを指定できます。 .NET Standard 2.1/.NET Core 2.1以降では、StandardInputEncodingプロパティで標準入力のエンコーディングも指定できます。
parent.exe:子プロセスの標準ストリームのエンコーディングを指定して読み書きする .NET Standard 2.1/.NET Core 2.1
using System;
using System.Diagnostics;
using System.Text;
class Sample {
static void Main()
{
// 子プロセスchild.exeの起動オプション
var psi = new ProcessStartInfo("child.exe") {
// シェルを使用せず子プロセスを起動する
// (リダイレクトするために必要)
// ⚠.NET Core/.NET 5以降ではデフォルトでfalseとなっている
UseShellExecute = false,
// 起動した子プロセスの標準入出力をリダイレクトする
RedirectStandardInput = true,
RedirectStandardOutput = true,
// 標準入力への書き込み時にShift_JISを用いる
StandardInputEncoding = shift_jis,
// 標準出力からの読み込み時にUTF-8を用いる
StandardOutputEncoding = Encoding.UTF8,
};
// 子プロセスを起動する
using (var child = Process.Start(psi)) {
string output = null;
// リダイレクトされた子プロセスの標準入出力を取得する
using (var stdin = child.StandardInput)
using (var stdout = child.StandardOutput) {
// 子プロセスの標準入力に書き込む
stdin.WriteLine("こんにちは、世界🌐");
// 子プロセスの標準出力から読み込む
output = stdout.ReadLine();
} // 子プロセスの標準入出力を閉じて読み書きを終了する
// 子プロセスの終了を待機する
child.WaitForExit();
// 読み込んだテキストを表示する
Console.WriteLine($"output: \"{output}\"");
}
}
static readonly Encoding shift_jis =
#if NETFRAMEWORK
Encoding.GetEncoding("shift_jis");
#else
// `dotnet add sample.csproj package System.Text.Encoding.CodePages`
CodePagesEncodingProvider.Instance.GetEncoding("shift_jis");
#endif
}
child.exe:標準入力(Shift_JIS)から読み込み標準出力(UTF-8)に書き込む
using System;
using System.IO;
using System.Security.Cryptography;
class Sample {
static void Main()
{
// 標準入力のエンコーディングにShift_JISを用いる
Console.InputEncoding = shift_jis;
// 標準出力のエンコーディングにUTF-8を用いる
Console.OutputEncoding = Encoding.UTF8;
// 標準入力から読み込んだ内容をそのまま標準出力に書き込む
// (Shift_JISからUTF-8へ変換される)
Console.WriteLine(Console.ReadLine());
}
static readonly Encoding shift_jis =
#if NETFRAMEWORK
Encoding.GetEncoding("shift_jis");
#else
// `dotnet add sample.csproj package System.Text.Encoding.CodePages`
CodePagesEncodingProvider.Instance.GetEncoding("shift_jis");
#endif
}
実行結果
>parent.exe
output: "こんにちは、世界??"
StandardInputEncodingプロパティにUTF-8などのエンコーディングを指定すると、子プロセスの標準入力にBOM(Byte Order Mark)が出力される場合があります。 この動作はランタイムの種類や実行環境によって異なります。 詳細についてはEncodingクラスとBOMありなしの制御 §.標準ストリームを参照してください。