我在CharUnion結構中遇到了cyrilic unicode字符的問題。Cyrilic CharUnion.UnicodeChar
這裏的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或更改字符集只是導致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');
正確寫入字符。所以我不認爲這個問題是在控制檯編碼。另外改變它也沒有任何結果。
您可能沒有正確聲明您的dllimport。請參閱[C#獲取窗口的標題按希伯來語返回問號句柄](http://stackoverflow.com/questions/19144658/c-sharp-getting-windows-title-by-handle-in-hebrew-return-question-marks ) –
@ raymond-chen 謝謝你的聯繫,不幸的是我明天就可以試用,只要我有任何結果,我會通知你 再次謝謝 –
@ raymond-chen As我promissed: 改變CharSet給我沒有任何積極的結果。另外我試圖使用WriteConsoleOutputW,但仍然是一樣的。控制檯輸出的Ascii部分更改爲錯誤符號,但使用'\ u0430'時,輸出仍然爲「0」。這裏沒有變化 –