Próbuję odczytać ciąg Unicode z konsoli w C#, przez wzgląd na przykład, pozwala Uset jego jedno:Czytanie Unicode z konsoli
c: \ SVN \ D³ebugger \ src \ виталик \ Program.cs
na początku po prostu starał się Console.ReadLine()
który wrócił mi c:\SVN\D3ebugger\src\???????\Program.cs
próbowałem ustawić Console.InputEncoding do UTF8 jak tak Console.InputEncoding = Encoding.UTF8
ale wrócił mi c:\SVN\D³ebugger\src\???????\Program.cs
zasadniczo niszczeniu cyrylicy część łańcucha .
Tak chaotycznie próbowałem ustawić kodowanie w ten sposób, Console.InputEncoding = Encoding.GetEncoding(1251);
, który zwrócił c:\SVN\D?ebugger\src\виталик\Program.cs
, tym razem uszkadzając znak ³.
W tym momencie wydaje się, że przełączając encodings dla InputStream, mogę uzyskać tylko jeden język na raz.
Próbowałem zostały również dzieje rodzimych i robi coś takiego:
// 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);
To działa dobrze na znaki inne niż Unicode, jednak, gdy próbowałem zrobić to przeczytać mój przykładowy ciąg, aplikacja zawieszała . Próbowałem powiedzieć programowi Visual Studio, aby złamał WSZYSTKIE wyjątki (w tym natywne), ale aplikacja nadal ulega awarii.
Znalazłem także this otwarty błąd w Microsoft's Connect, który wydaje się mówić, że nie jest możliwe odczytywanie Unicode z InputStream w konsoli.
Warto zauważyć, choć nie jest to ściśle związane z moim pytaniem, że Console.WriteLine jest w stanie wydrukować ten ciąg dobrze, jeśli Console.OutputEncoding jest ustawione na UTF8.
Dziękujemy!
Update 1
szukam rozwiązania dla .NET 3.5
Aktualizacja 2
Aktualizacja z pełnego kodu natywnego używałem.
Czy jest możliwe/akceptowalne użyć nazwanego potoku zamiast konsoli? – Goyuix
Jeśli nie znajdę rozwiązania, to prawdopodobnie to zrobię ... – VitalyB