Итак, я создаю программу, которая может читать вывод из командной строки Windows. Это работает, как показано здесь:
Process process = new Process();
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
process.ErrorDataReceived += new DataReceivedEventHandler(p_ErrorDataReceived);
В обработчике событий я объединяю вывод в сеть. (сервер тоже написан на C# с использованием потоков)
static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (!String.IsNullOrEmpty(e.Data))
{
socketInput.WriteLine(e.Data);
socketInput.Flush();
}
}
Это работает почти полностью, за исключением того, что некоторые специальные символы (например, шведские символы) печатаются как тарабарщина на стороне сервера. Я пробовал только Console.WriteLine(e.Data) на стороне клиента, и это, похоже, работает, поэтому я думаю, что это связано с моей кодировкой в сетевой части. Может ли кто-нибудь объяснить мне проблему здесь? Я пытался выяснить, какую кодировку использовать, но безуспешно.
КСТАТИ. Вот потоки сокетов (на стороне сервера они похожи)
socketInput = new StreamWriter(client.GetStream());
socketOutput = new StreamReader(client.GetStream());
Клиентская сторона Socket Init:
TcpClient client = new TcpClient();
//retry connection until found
while (true)
{
try
{
client.Connect("127.0.0.1", 4444);
}
catch (Exception ex)
{
//handle errors
continue;
}
if (client.Connected) break;
System.Threading.Thread.Sleep(1);
}
Сторона сервера Socket Init:
TcpListener listener = new TcpListener(IPAddress.Any, 4444);
listener.Start();
Console.WriteLine("Waiting for a connection...");
TcpClient client = listener.AcceptTcpClient();
Получение кода (запускается в отдельном потоке):
while(true)
{
try
{
Console.WriteLine(socketOutput.ReadLine());
} catch(Exception e)
{
Console.WriteLine("Connection lost!");
return;
}
}
обновил сообщение с более подробной информацией
Вы распечатываете его на консоли. Все потоки, которые вы используете по умолчанию, соответствуют UTF-8, но консоль не может обрабатывать UTF-8. Это твоя проблема. Если вы выводите сообщение в окно или форму, оно должно отображаться правильно.
Ну, поскольку я изначально беру вывод из CMD, я должен иметь возможность вывести его в моей собственной консоли, верно? Теперь остается вопрос, какую кодировку использует вывод CMD, чтобы я мог использовать ту же кодировку для своих потоков.
Encoding.Default должен предоставить вам стандартную кодировку Windows, используемую машиной.
Тогда почему приведенный выше код не работает должным образом с кодировкой ?? Разве он уже не использует кодировку по умолчанию?
Как я уже говорил ранее ... the streams you use all default to UTF-8. Использование кодировки ansi ПК по умолчанию - довольно плохая идея для сетевых вещей, поскольку на разных ПК она может быть разной. Но, честно говоря, я понятия не имею, как вам нужно выводить данные на консоль в определенной кодировке ... вам придется исследовать это самостоятельно.





"распечатывает тарабарщину на стороне сервера". - покажите, пожалуйста, актуальный код инициализации и получения сокета. Возможно, вы неправильно отправляете консольный текст ... но с тем же успехом может оказаться, что вы просто неправильно обрабатываете полученные данные. Что делать после получения данных? Как сохранить / отобразить / проверить?