Tôi cố gắng để đọc chuỗi unicode từ một giao diện điều khiển trong C#, vì lợi ích của ví dụ, cho phép uset mình một:Reading unicode từ console
c: \ SVN \ D³ebugger \ src \ виталик \ Program.cs
Lúc đầu, tôi chỉ cố gắng để Console.ReadLine()
đó trở tôi c:\SVN\D3ebugger\src\???????\Program.cs
tôi đã cố gắng để thiết lập các Console.InputEncoding để UTF8 như vậy Console.InputEncoding = Encoding.UTF8
nhưng đó quay trở lại tôi c:\SVN\D³ebugger\src\???????\Program.cs
, về cơ bản mucking lên phần Cyrillic của chuỗi .
Vì vậy, ngẫu nhiên tôi đã cố gắng đặt mã hóa như vậy, Console.InputEncoding = Encoding.GetEncoding(1251);
trả lại c:\SVN\D?ebugger\src\виталик\Program.cs
, lần này làm hỏng ký tự ³.
Tại thời điểm này có vẻ như bằng cách chuyển đổi encodings cho InputStream, tôi chỉ có thể nhận được một ngôn ngữ duy nhất tại một thời điểm.
Tôi cũng đã thử đi bản địa và làm một cái gì đó như thế:
// 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);
Đó đã làm việc tốt cho các chuỗi không unicode, tuy nhiên, khi tôi đã cố gắng để làm cho nó đọc chuỗi mẫu của tôi, các ứng dụng bị rơi . Tôi đã cố gắng để nói với Visual Studio để phá vỡ tất cả ngoại lệ (bao gồm cả những người bản xứ), được nêu ra, ứng dụng sẽ vẫn sụp đổ.
Tôi cũng đã tìm thấy lỗi this lỗi mở trong Kết nối của Microsoft có vẻ như là không thể đọc ngay từ đầu vào của bảng điều khiển. Điều này đáng chú ý, mặc dù không liên quan chặt chẽ đến câu hỏi của tôi, rằng Console.WriteLine có thể in chuỗi này tốt, nếu Console.OutputEncoding được đặt thành UTF8.
Cảm ơn bạn!
Cập nhật 1
Tôi đang tìm kiếm một giải pháp cho .NET 3.5
Cập nhật 2
cập nhật với mã nguồn gốc đầy đủ Tôi đã sử dụng.
Có thể/có thể chấp nhận sử dụng một ống tên thay cho giao diện điều khiển? – Goyuix
Nếu tôi không tìm thấy giải pháp thì đó có thể là những gì tôi sẽ làm ... – VitalyB