2010-01-21 45 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