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();
Надеюсь, что это кому-то поможет.