通过C++程序在PowerShell中打印Unicode字符

4
我的最终目标是通过一个C++程序在Windows控制台中输出一些非拉丁文本。cmd.exe对我没有用,所以我使用了最新的、支持Unicode的PowerShell(版本很新)。我已经确认我可以输入非Unicode字符并从Windows命令(如“dir”)中看到非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++程序中做错了什么吗?

谢谢!


我刚刚注意到执行“PS> [char]0xAC00”会打印出正确的字符。所以我的应用程序确实存在问题... - bcx_2000
1个回答

8

从printf文档中可以得知:

如果流以ANSI模式打开,wprintf和printf的行为是相同的。

查看这篇博客文章。它有一个简短的代码清单:

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

谢谢,这帮了我很多。结果发现在cmd.exe上指定_O_U16TEXT是正确的,但在Powershell上不行。我一直在抓狂,直到我发现将其设置为_O_U8TEXT可以在Powershell上工作(但使用UTF-16文本!)。这让我觉得这是Powershell中的一个错误,所以我向connect.microsoft.com提交了一个错误报告。不知道有没有人会看它。我希望这只是他们混淆了,而不是更根本的问题。再次感谢您对此的见解。 - bcx_2000
非常好。我总是忘记迈克尔·卡普兰是所有Unicode相关事物的首选站点。 - jveazey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接