Cyrillic CharUnion.UnicodeChar

时间:2016-03-02 13:36:16

标签: c# winapi unicode char

我在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');

正确写入字符。所以我认为问题不在于控制台编码。改变它也没有任何结果。

1 个答案:

答案 0 :(得分:0)

可能的问题是您的Console.WriteLine(buffer)调用正在写入为ASCII配置的控制台。

通过执行Console.OutputEncoding = System.Text.Encoding.Unicode更改控制台以显示Unicode字符,然后尝试输出缓冲区。