проблема кодирования process.standardInput - PullRequest
16 голосов
/ 18 мая 2010

У меня проблема с кодировкой кодировки process.standartInput. Я использую какой-то процесс в моем приложении Windows Form, но ввод должен быть 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(); 

Ответы [ 4 ]

24 голосов
/ 10 августа 2011

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

StreamWriter utf8Writer = new StreamWriter(proc.StandardInput.BaseStream, Encoding.UTF8);
utf8Writer.Write(...);
utf8Writer.Close();
8 голосов
/ 09 сентября 2016

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

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

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

Надеюсь, это сэкономит кому-то время.

5 голосов
/ 16 мая 2016

Другое решение состоит в том, чтобы установить консольное InputEncoding перед созданием процесса.

Console.InputEncoding = Encoding.UTF8;
1 голос
/ 18 мая 2010

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

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());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...