2010-01-21 46 views
4

我的最終目標是通過C++程序在Windows中將一些非拉丁文本輸出寫入控制檯。通過C++程序在PowerShell中打印Unicode字符

cmd.exe讓我無處可去,所以我得到了PowerShell的最新發亮版本(支持unicode)。我已驗證我可以

  • 型非Unicode字符和
  • 看到窗口的命令非Unicode控制檯輸出(如「目錄」)

例如,我有這個文件中,「가.TXT」(가是韓文字母的第一個字母),我可以得到一個輸出這樣的:

PS P:\reference\unicode> dir .\가.txt 

    Directory: P:\reference\unicode 

Mode    LastWriteTime  Length 
Name              
----    -------------  ------ 
----              
-a---   1/12/2010 8:54 AM   0 가.txt  

到目前爲止好。但使用C++程序寫入控制檯不起作用。

int main() 
{ 
    wchar_t text[] = {0xAC00, 0}; // 가 has code point U+AC00 in unicode 
    wprintf(L"%s", text); // this prints a single question mark: "?" 
} 

我不知道我在想什麼。我可以在控制檯上鍵入並看到가的事實似乎表明我有三個需要的部分(unicode支持,字體和字形),但我必須弄錯。

我也試過「chcp」沒有任何運氣。我在C++程序中做錯了什麼?

謝謝!

+0

我剛剛注意到做「PS> [char] 0xAC00」打印正確的字符。所以我確實在我的應用程序中做錯了什麼... – 2010-01-21 08:25:37

回答

7

從printf的文檔:

wprintf和printf的行爲相同 如果流在ANSI模式下打開。

看看這個blog post。它有這個不錯的簡短的小清單:

#include <fcntl.h> 
#include <io.h> 
#include <stdio.h> 

int main(void) { 
    _setmode(_fileno(stdout), _O_U16TEXT); 
    wprintf(L"\x043a\x043e\x0448\x043a\x0430 \x65e5\x672c\x56fd\n"); 
    return 0; 
} 
+0

謝謝,這有很多幫助。事實證明,指定_O_U16TEXT在cmd.exe上正常工作,但不在Powershell上。我直到發現將它設置爲_O_U8TEXT才能在Powershell上工作(但是使用UTF-16文本!這使我擔心Powershell中的一個bug,所以我向connect.microsoft.com提交了一個bug。不知道有沒有人讀過它。我希望這只是他們的簡單混淆,而不是一些更根本性的錯誤。再次感謝您對此的見解。 – 2010-01-23 10:11:49

+0

非常好。我一直忘記邁克爾卡普蘭是Unicode的第一站。 – jveazey 2011-07-14 06:16:04