对于在英语Windows(XP,Vista或7)上使用Visual Studio 2008编译的C++控制台应用程序.是否可以打印到控制台并使用cout或wcout正确显示UTF-8编码的日语?
我相信自从Windows ME诞生以来,13年多以前可以在控制台应用程序上显示阿拉伯字符.
现在我使用的是Visual Studio 2013,在Windows 8上,以下代码显示:
????? ??
Console.OutputEncoding = System.Text.Encoding.Unicode;
Console.WriteLine("????? ??");
Run Code Online (Sandbox Code Playgroud)
无论如何在控制台输出中显示阿拉伯字符?
以下代码显示了我的计算机上的意外行为(在Windows XP和Windows 7上的VS 2012上使用Visual C++ 2008 SP1进行了测试):
#include <iostream>
#include "Windows.h"
int main() {
SetConsoleOutputCP( CP_UTF8 );
std::cout << "\xc3\xbc";
int fail = std::cout.fail() ? '1': '0';
fputc( fail, stdout );
fputs( "\xc3\xbc", stdout );
}
Run Code Online (Sandbox Code Playgroud)
我简单编译了cl /EHsc test.cpp.
Windows XP:控制台窗口中的输出
ü0ü(转换为代码页1252,最初显示默认代码页中的一些线条图,可能是437).当我更改控制台窗口的设置以使用"Lucida Console"字符集并再次运行我的test.exe时,输出更改为1ü,这意味着
ü可以使用fputsUTF-8编码来编写字符C3 BCstd::cout 因任何原因都不起作用failbit尝试写字符后,流设置Windows 7:使用Consolas输出??0ü.更有趣.可能写入正确的字节(至少在将输出重定向到文件时)并且流状态正常,但这两个字节被写为单独的字符).
我试图在"Microsoft Connect"(见这里)上提出这个问题,但是MS并没有太大的帮助.你可以在这里看一下 以前曾经问过类似的东西.
你能重现这个问题吗?
我究竟做错了什么?不应该std::cout和fputs有相同的效果?
解决:(排序)继mike.dld的想法,我实现了一个std::stringbuf …