Судя по всему, sf c записывает перенаправленный вывод как Unicode, используя WriteFile. Затем вы можете помочь потребителю декодировать его, указав
p.StartInfo.StandardOutputEncoding = System.Text.Encoding.Unicode;
В связанной заметке - следите за переполнением буфера каналов. Вы читаете перенаправленный вывод с блокировкой вызовов на StreamReader.ReadToEnd
. Вы можете зайти в тупик, заблокировав чтение одного потока, пока дочерний процесс пытается выполнить запись в другой. Самое простое решение - использовать StreamReader.ReadToEndAsync
хотя бы для одного потока:
var output_task = p.StandardOutput.ReadToEndAsync();
string error = p.StandardError.ReadToEnd();
string output = output_task.Result;