3

我正在使用此代码直接从控制台读取。

    public char? ReadCharacterAt(int x, int y)
    {
        IntPtr consoleHandle = GetStdHandle(-11);
        if (consoleHandle == IntPtr.Zero)
        {
            return null;
        }
        var position = new Coord
        {
            X = (short)x,
            Y = (short)y
        };
        var result = new StringBuilder(1);
        uint read = 0;
        if (ReadConsoleOutputCharacter(consoleHandle, result, 1, position, out read))
        {
            return result[0];
        }
        else
        {
            return null;
        }
    }

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern IntPtr GetStdHandle(int nStdHandle);

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool ReadConsoleOutputCharacter(IntPtr hConsoleOutput, [Out] StringBuilder lpCharacter, uint length, Coord bufferCoord, out uint lpNumberOfCharactersRead);

    [StructLayout(LayoutKind.Sequential)]
    public struct Coord
    {
        public short X;
        public short Y;
    }

但是,对于德语变音符号 (äüö),这不会返回正确的字符。我想知道我该如何解决?

更新

正如 Hans 和 Raymond 所指出的,答案在于 DLL 导入。我所要做的就是将其更改为:

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
4

1 回答 1

3

从 SDK 文档:

此函数使用控制台当前代码页中的 Unicode 字符或 8 位字符。控制台的代码页最初默认为系统的 OEM 代码页。要更改控制台的代码页,请使用 SetConsoleCP 或 SetConsoleOutputCP 函数,或使用 chcp 或 mode con cp select= 命令。

由于您没有在 [DllImport] 属性中指定 CharSet,因此您将获得 8 位字符。从技术上讲,您可以通过读取 byte[] 并使用 Console.OutputEncoding.GetString() 进行转换来使其工作。但不要,使用 CharSet.Unicode 让 Windows 为您进行转换。

于 2012-07-14T17:46:55.550 回答