Process.standardInput проблема кодирования

У меня проблема с кодировкой кодировки process.standartInput. Я использую какой-то процесс в моем приложении формы Windows, но ввод должен быть UTF-8. Process.StandardInput.Encoding читается только, поэтому я не могу установить его в UTF-8, и он получает кодировку по умолчанию Windows, которая ухудшает собственные символы, которые хороши в UTF-8. В программе используются 2 процесса, один записывает вывод в файл и другие чтения. Поскольку я могу настроить выходное кодирование на UTF-8, эта часть работает правильно, но чтение обратно является той частью, где возникают проблемы. Я включу часть, в которой я использую этот процесс.

ProcessStartInfo info = new ProcessStartInfo("mysql");
info.RedirectStandardInput = true;
info.RedirectStandardOutput = false;
info.Arguments = mysqldumpstring;
info.UseShellExecute = false;
info.CreateNoWindow = true;
Process p1 = new Process();
p1.StartInfo = info;
p1.Start();
string res = file.ReadToEnd();
file.Close();
MessageBox.Show(p1.StandardInput.Encoding.EncodingName); //= where encoding should be Encoding.UTF8;
p1.StandardInput.WriteLine(res);
p1.Close(); 

Ответы

Ответ 1

теперь он работает, теперь установите тип вывода моего приложения в консольное приложение и сумел скрыть окно консоли перед формами. Он в основном работает нормально, только когда программа запускается, окна консоли скрываются и скрываются.

static class Program
{
    [DllImport("kernel32.dll")]
    static extern bool AttachConsole(int dwProcessId);
    private const int ATTACH_PARENT_PROCESS = -1;

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool SetConsoleCP(
         uint wCodePageID
         );

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern uint GetConsoleCP();

    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Console.Title = "Stok";
        // redirect console output to parent process;
        // must be before any calls to Console.WriteLine()
        AttachConsole(ATTACH_PARENT_PROCESS);
        System.Console.InputEncoding = Encoding.UTF8;

        IntPtr hWnd = FindWindow(null, "Stok"); //put your console window caption here

        if (hWnd != IntPtr.Zero)
        {
            //Hide the window
            ShowWindow(hWnd, 0); // 0 = SW_HIDE
        }

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

Ответ 2

Использование StreamWriter, созданного следующим образом (вместо стандартного ввода), дает желаемый результат:

StreamWriter utf8Writer = new StreamWriter(proc.StandardInput.BaseStream, Encoding.UTF8);
utf8Writer.Write(...);
utf8Writer.Close();

Ответ 3

Еще одно решение - установить Console InputEncoding перед созданием процесса.

Console.InputEncoding = Encoding.UTF8;

Ответ 4

Я только что столкнулся с этой проблемой и не смог использовать технику Console.InputEncoding, потому что она работает только в консольных приложениях.

Из-за этого я попробовал ответить Виктору, однако я столкнулся с той же проблемой, что и комментатор MvanGeest, где по спецификации все еще добавляется. Через некоторое время я обнаружил, что возможно создать новый экземпляр кодировки UTF8Encoding, у которого была отключена спецификация, поэтому это останавливает запись спецификации. Ниже приведена модифицированная версия примера Виктора, показывающая изменение.

StreamWriter utf8Writer = new StreamWriter(proc.StandardInput.BaseStream, new UTF8Encoding(false));
utf8Writer.Write(...);
utf8Writer.Close();

Надеюсь, что это кому-то поможет.