none
Как определить кодировку для стандартного вывода в консольное приложение? RRS feed

  • Вопрос

  • Мой вопрос связан с задачей об обеспечении интерактивной работы моего приложения со сторонним консольным приложением. Данная задача по большому счёту решена, но не получается обеспечить отправки кириллицы в консольное приложение из моей программы.

    На странице http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.standardoutputencoding.aspx написано о том, как определить кодировку для вывода в консольное приложение (Process.StandardOutput), но как определить кодировку для ввода (Process.StandardInput)  нигде не могу найти.

    Попытки использовать кодировки ANSI, UTF-8 и OEM не увенчались успехом

    Итак, пример кода работы с консольным приложением:

    ...
    Process cmdProcess = new Process();
    cmdProcess.StartInfo.FileName = "ConsoleApplication.exe";
    cmdProcess.StartInfo.UseShellExecute = false;
    cmdProcess.StartInfo.CreateNoWindow = true;
    cmdProcess.StartInfo.RedirectStandardOutput = true;
    cmdProcess.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(866); 
    cmdProcess.OutputDataReceived += new DataReceivedEventHandler(cmdProcess_OutputDataReceived);
    cmdProcess.StartInfo.RedirectStandardInput = true;
    cmdProcess.Start();
    StreamWriter streamWriter = cmdProcess.StandardInput;
    cmdProcess.BeginOutputReadLine();
    streamWriter.WriteLine("Тестовый текст");
    streamWriter.WriteLine(DefaultToOEM("Тестовый текст"));
    streamWriter.WriteLine(DefaultToUT8("Тестовый текст"));
    streamWriter.WriteLine("");
    streamWriter.Close();
    ...

    и пример кода используемого для перекодировки кода в соответствующую кодировку (для краткости привожу пример перекодировки только в OEM кодировку):

    private string DefaultToOEM(string str)
    {
    	byte[] bytes = Encoding.Default.GetBytes(str);
    	byte[] resultBytes = Encoding.Convert(Encoding.Default, Encoding.GetEncoding(866), bytes);
    	string result = Encoding.GetEncoding(866).GetString(resultBytes);
    	return result;
    }

    В целях тестирования использовалось консольное приложение со следующим исходным кодом:

    static void Main(string[] args)
    {
    	Console.WriteLine("Тестовый пример");
    	string str = Console.ReadLine();
    	while (!string.IsNullOrEmpty(str))
    	{
    		Console.WriteLine(string.Format(">>> {0}", str));
    		str = Console.ReadLine();
    	}
    }

    Так выглядит результат теста:

    Заранее благодарен за ответ

Ответы

Все ответы