我在CharUnion结构中遇到了Cyrillic unicode字符的问题。
这是DLLImport声明:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteConsoleOutput(
SafeFileHandle hConsoleOutput,
CharInfo[] lpBuffer,
Coord dwBufferSize,
Coord dwBufferCoord,
ref SmallRect lpWriteRegion);
[DllImport("Kernel32.dll", SetLastError = true, CharSet=CharSet.Auto)]
static extern SafeFileHandle CreateFile(
string fileName,
[MarshalAs(UnmanagedType.U4)] uint fileAccess,
[MarshalAs(UnmanagedType.U4)] uint fileShare,
IntPtr securityAttributes,
[MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
[MarshalAs(UnmanagedType.U4)] int flags,
IntPtr template);
使用WriteConsoleOutputW或更改CharSet只会导致Ascii字符显示错误,但cyrilic unicode没有变化。
以下是结构:
[StructLayout(LayoutKind.Explicit)]
public struct CharUnion
{
[FieldOffset(0)] public char UnicodeChar;
[FieldOffset(0)] public byte AsciiChar;
}
[StructLayout(LayoutKind.Explicit)]
public struct CharInfo
{
[FieldOffset(0)] public CharUnion Char;
[FieldOffset(2)] public short Attributes;
}
创建WriteConsoleOutput使用的句柄:
SafeFileHandle Handle = CreateFile("CONOUT$", 0x40000000, 2, IntPtr.Zero, FileMode.Open, 0, IntPtr.Zero);
这是我填写它的一个例子:
CharInfo[] buffer = new CharInfo[10];
buffer.Char.UnicodeChar = '\u0430';
之后我使用导入的 WriteConsoleOutput 函数将其写入控制台缓冲区。 它工作正常,而我不使用cyrilic字母。
如果上面我在输出中得到“0”符号(它等于'\ u0030',如果我没有弄错的话),在我看来,它只读取一个字符的字节。
你可以帮我解决这个问题吗? 真的找不到任何亲戚。UPD:
Console.WriteLine('\u0430');
正确写入字符。所以我认为问题不在于控制台编码。改变它也没有任何结果。
答案 0 :(得分:0)
可能的问题是您的Console.WriteLine(buffer)
调用正在写入为ASCII配置的控制台。
通过执行Console.OutputEncoding = System.Text.Encoding.Unicode
更改控制台以显示Unicode字符,然后尝试输出缓冲区。