2012-07-14 5 views
3

이 코드를 사용하여 콘솔에서 직접 읽습니다.독일어 움라우트에서 ReadConsoleOutputCharacter가 작동하지 않습니다.

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; 
    } 

그러나 독일어 움라우트 (äüö)의 경우 올바른 문자가 반환되지 않습니다. 어떻게 해결할 수 있을까? 한스와 레이몬드는 지적

UPDATE는

, 대답은 DLL 가져 오기 낳는다. 내가해야 할 일을했을 모두로 변경 한 다음 SDK의 문서에서

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

올바른 문자를 반환하지 않는다고 말하면 무엇을 반환합니까? 내 생각 엔'CharSet = CharSet.Unicode'을 지정하지 않았기 때문에 코드 페이지를 잘못 해석하고있는 것입니다. –

답변

3

:

이 기능은 콘솔의 현재 코드 페이지에서 유니 코드 문자 또는 8 비트 문자 중 하나를 사용합니다. 콘솔의 코드 페이지는 기본적으로 시스템의 OEM 코드 페이지로 기본 설정됩니다. 콘솔의 코드 페이지를 변경하려면 SetConsoleCP 또는 SetConsoleOutputCP 함수를 사용하거나 chcp 또는 mode con cp select = 명령을 사용하십시오.

[DllImport] 속성에서 CharSet을 지정하지 않았으므로 8 비트 문자가 표시됩니다. 기술적으로 byte []로 읽어 들이고 Console.OutputEncoding.GetString()으로 변환하여 제대로 작동 할 수 있습니다. CharSet.Unicode를 사용하면 Windows에서 변환을 수행하게 할 수 있습니다.

+0

고맙습니다. 솔루션을 제공하기 위해 내 대답을 업데이트했습니다. 나는 Charset을 지정하기 위해 DLLImport를 변경해야했습니다. 따라서 나머지 모든 항목 (예 : StringBuilder에서 읽음)은 실제로 동일하게 유지 될 수 있습니다. 내가 그것을 받아 들일 수 있도록 당신의 대답을 업데이트하는 것은 어떨까요? – Christoph

+0

그것이 내가 말한 것입니다 : "이것을 피하기 위해 CharSet.Unicode를 사용하십시오". –

+0

아, 죄송합니다. 나는 그것을 잘못 읽었다. 당신이 그것을 지정하지 않으면 나는 그것을 바이트 []로 읽고 수동 작업을해야 할 것입니다. 만약 내가 * * 그것을 지정하면 코드는 그대로있을 수 있습니다. 그게 네가 한 말이다. 그렇지? – Christoph

관련 문제