Я пытаюсь прочитать строку Unicode из консоли в C #, например, давайте использовать его:
C: \ SVN \ D³ebugger \ SRC \ виталик \ Program.cs
Сначала я просто попытался Console.ReadLine()
, который вернул мне c:\SVN\D3ebugger\src\???????\Program.cs
Я пытался установить для Console.InputEncoding значение UTF8, например, Console.InputEncoding = Encoding.UTF8
, но это вернуло меня c:\SVN\D³ebugger\src\???????\Program.cs
, в основном путая кириллическую часть строки.
Так беспорядочно спотыкаясь, я попытался установить кодировку следующим образом: Console.InputEncoding = Encoding.GetEncoding(1251);
, которая вернула c:\SVN\D?ebugger\src\виталик\Program.cs
, на этот раз искажая символ ³.
На данный момент кажется, что переключая кодировки для InputStream, я могу получить только один язык за раз.
Я также пытался перейти на родной язык и сделать что-то подобное:
// Code
public static string ReadLine()
{
const uint nNumberOfCharsToRead = 1024;
StringBuilder buffer = new StringBuilder();
uint charsRead = 0;
bool result = ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), buffer, nNumberOfCharsToRead, out charsRead, (IntPtr)0);
// Return the input minus the newline character
if (result && charsRead > 1) return buffer.ToString(0, (int)charsRead - 1);
return string.Empty;
}
// Extern definitions
[DllImport("Kernel32.DLL", ExactSpelling = true)]
internal static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", CharSet = CharSet.Unicode, ExactSpelling = true)]
static extern bool ReadConsoleW(IntPtr hConsoleInput, [Out] StringBuilder lpBuffer,
uint nNumberOfCharsToRead, out uint lpNumberOfCharsRead, IntPtr lpReserved);
Это работало нормально для строк, не относящихся к юникоду, однако, когда я попытался заставить его прочитать мою строку-образец, приложение зависло. Я пытался сказать Visual Studio, чтобы он прерывался на ВСЕХ исключениях (включая собственные), но приложение все равно зависало.
Я также обнаружил эту открытую ошибку в Microsoft Connect, которая, кажется, говорит, что сейчас невозможно прочитать Unicode из InputStream консоли.
Стоит отметить, хотя Console.WriteLine, хотя и не относится строго к моему вопросу, может нормально печатать эту строку, если для Console.OutputEncoding задано значение UTF8.
Спасибо!
Обновление 1
Я ищу решение для .NET 3.5
Обновление 2
Обновлено с полным исходным кодом, который я использовал.