Седующий кусок кода по моему замыслу дожен выводить то, что юзер вводит в консоли с клавиатурп. Для англицких букв так и есть, а вто с русской кодировкой — проблемы. То вопросительные знаки, то другая фигня выводится.
static void Main(string[] args)
{
ConsoleKeyInfo cki;
// Console.OutputEncoding = Encoding.GetEncoding(...);
// Console.InputEncoding = Encoding.GetEncoding(...);
do
{
cki = Console.ReadKey(true);
// byte b = (byte)cki.KeyChar;
// Console.Write(Convert.ToChar(b));
Console.Write(cki.KeyChar);
}
while (cki.Key != ConsoleKey.Escape);
}
Снимать комментарии и задавать различные кодировки вместо "..." не помогает.
Чувствую, что проблема должна решаться просто, но как — голову сломал!
Варианты типа Console.WriteLine(Console.ReadLine()); работает нормально, но мне не подходит...
Что надо изменить в коде кроме кривизны моих рук?
Здравствуйте, Аноним, Вы писали:
так работает, но как-то это не правильно
byte[] bytes = Encoding.Unicode.GetBytes(new char[] { cki.KeyChar });
Console.Write(Console.OutputEncoding.GetString(new byte[] { bytes[0] }));
Здравствуйте, Аноним, Вы писали:
А>так работает, но как-то это не правильно
А>А>byte[] bytes = Encoding.Unicode.GetBytes(new char[] { cki.KeyChar });
А>Console.Write(Console.OutputEncoding.GetString(new byte[] { bytes[0] }));
А>
Вполне правильно. Только не OutputEncoding, а InputEncoding (хотя честно то это по барабану). То что KeyChar имеет тип char — это обманка. Он не перекодирует в Unicode. Там сидит CP866 из-за давнишней совместимости с DOS.
Здравствуйте, <Аноним>, Вы писали:
А>Чувствую, что проблема должна решаться просто, но как — голову сломал!
А>Варианты типа Console.WriteLine(Console.ReadLine()); работает нормально, но мне не подходит...
А>Что надо изменить в коде кроме кривизны моих рук?
static void Main(string[] args)
{
ConsoleKeyInfo cki;
do
{
cki = Console.ReadKey(true);
char c = Console.InputEncoding.GetString(BitConverter.GetBytes(cki.KeyChar))[0]; // get unicode char (в соответствии с кодировкой ввода у консоли)...
Console.Write(c);
}
while (cki.Key != ConsoleKey.Escape);
}
... << RSDN@Home 1.2.0 alpha rev. 676>>
Здравствуйте, GlebZ, Вы писали:
А>>так работает, но как-то это не правильно
А>>А>>byte[] bytes = Encoding.Unicode.GetBytes(new char[] { cki.KeyChar });
А>>Console.Write(Console.OutputEncoding.GetString(new byte[] { bytes[0] }));
А>>
GZ>Вполне правильно. Только не OutputEncoding, а InputEncoding (хотя честно то это по барабану).
да, конечно InputEncoding, сначала пытался использовать I/OEncoding и конвертить а потом копи-пасте
GZ> То что KeyChar имеет тип char — это обманка. Он не перекодирует в Unicode. Там сидит CP866 из-за давнишней совместимости с DOS.
но там получается два байта, первый — сам символ в 866, а второй — 4.
"как-то это не правильно" потмоу что я просто забил на эти 4