我正在尝试在C#中从控制台读取Unicode字符串,为了举例,让我们使用这个:
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
,基本上弄乱了字符串的Cyrillic部分。
随机地尝试后,我尝试了这样设置编码: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);
对于非Unicode字符串,这个代码是有效的,但是当我尝试读取Unicode字符串时,应用程序会崩溃。我已经尝试告诉Visual Studio在所有异常(包括本机异常)上中断,但是应用程序仍然会崩溃。
我还发现Microsoft Connect上有一个未解决的bug (链接),似乎现在无法从控制台的InputStream读取Unicode。
值得注意的是,尽管与我的问题不严格相关,但如果将Console.OutputEncoding设置为UTF8,则Console.WriteLine可以很好地打印此字符串。
谢谢!
更新1
我正在寻找.NET 3.5的解决方案
更新2
附上我使用的完整本地代码。