【发布时间】:2012-03-19 03:18:17
【问题描述】:
我正在尝试从 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,基本上是弄乱了字符串的西里尔字母部分。
所以随机绊倒我试图设置这样的编码,Console.InputEncoding = Encoding.GetEncoding(1251); 返回c:\SVN\D?ebugger\src\виталик\Program.cs,这一次破坏了 ³ 字符。
此时看来,通过为 InputStream 切换encodings,我一次只能获得一种语言。
我也尝试过本地化并做类似的事情:
// 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 字符串运行良好,但是,当我试图让它读取我的示例字符串时,应用程序崩溃了。我试图告诉 Visual Studio 中断所有异常(包括本机异常),但应用程序仍然会崩溃。
我还在 Microsoft 的 Connect 中发现了 this open 错误,这似乎表明现在无法从控制台的 InputStream 中读取 Unicode。
值得注意的是,即使与我的问题没有严格相关,如果 Console.OutputEncoding 设置为 UTF8,Console.WriteLine 能够很好地打印此字符串。
谢谢!
更新 1
我正在寻找 .NET 3.5 的解决方案
更新 2
使用我使用过的完整本机代码进行了更新。
【问题讨论】:
-
是否可以/可以接受使用命名管道而不是控制台?
-
如果我找不到解决方案,那我可能会这样做......