2016-03-02 56 views
0

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

正確寫入字符。所以我不認爲這個問題是在控制檯編碼。另外改變它也沒有任何結果。

+0

您可能沒有正確聲明您的dllimport。請參閱[C#獲取窗口的標題按希伯來語返回問號句柄](http://stackoverflow.com/questions/19144658/c-sharp-getting-windows-title-by-handle-in-hebrew-return-question-marks ) –

+0

@ raymond-chen 謝謝你的聯繫,不幸的是我明天就可以試用,只要我有任何結果,我會通知你 再次謝謝 –

+0

@ raymond-chen As我promissed: 改變CharSet給我沒有任何積極的結果。另外我試圖使用WriteConsoleOutputW,但仍然是一樣的。控制檯輸出的Ascii部分更改爲錯誤符號,但使用'\ u0430'時,輸出仍然爲「0」。這裏沒有變化 –

回答

0

可能的問題是您的Console.WriteLine(buffer)調用正在寫入配置爲ASCII的控制檯。

通過執行Console.OutputEncoding = System.Text.Encoding.Unicode更改控制檯以顯示Unicode字符,然後嘗試輸出緩衝區。

+0

請參閱發佈更新,已經嘗試過,也只是使用Console.WriteLine在控制檯中編寫此符號,即使使用默認編碼也會給出正面結果。 –

+0

如果我不'緩衝區[0] .Char.UnicodeChar =「\ u0430」;',寫慰問的Unicode字符似乎顯示效果細膩 –

+0

相同,但只有當我使用Windows功能WriteConsoleOutput –

相關問題