捕获另一个命令行程序的标准输出,其中的字符不在当前代码页中

时间:2015-01-03 15:30:28

标签: .net redirect process character-encoding stdout

我使用.NET ProcessStartInfo.RedirectStandardOutputProcess.BeginOutputReadLine来捕获另一个程序的标准输出(具体来说,youtube-dl.exe)并将它们保存到字符串变量中。

但结果变量只包含我的语言的常用字符,如繁体中文和英文字母;带有重音符号的韩语或拉丁字母等字符就会消失。

File.WriteAllText - 修改了结果变量并使用多个文本编辑器检查了文件,因此我确定它们已经丢失,而不是它们存在且仅仅是不可显示的控制台窗口。

在Windows命令提示符中明确执行youtube-dl会显示包含这些外来字符的完整消息。

我的youtubeDL_process.OutputDataReceived只是:

(s, e) => {
  if(!string.IsNullOrWhiteSpace(e.Data)) this._filename = e.Data;
}

如何使带有外来字符的重定向标准输出字符串完整,就像在命令提示符中直接生成的一样?

1 个答案:

答案 0 :(得分:0)

您直接将输出直接保存到文件中。试试这个

youtubeDL_process.OutputDataReceived += (s, e) => CaptureOutput(e.Data);
youtubeDL_process.Start();
youtubeDL_process.BeginOutputReadLine();


private void CaptureOutput(string s)
{
    Console.WriteLine("\r\n" + s);
    //write fileChunks here using a StreamWriter.... 
}

//因为CaptureOutput以字符串形式接收您的数据,尝试使用其他类型(.eg二进制文件)以便不删除字符串中的特殊字符(外来字符),还检查一些UTF8编码或任何其他编码方法文档。