对于在英语Windows(XP,Vista或7)上使用Visual Studio 2008编译的C++控制台应用程序.是否可以打印到控制台并使用cout或wcout正确显示UTF-8编码的日语?
以下代码显示了我的计算机上的意外行为(在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 …
我的代码就像这些一样简单:
#include <iostream>
using namespace std;
//Some codes here...
bool somefunction(){
cout<<"???";
return false;
}
Run Code Online (Sandbox Code Playgroud)
这就是我得到的:
error C2143: syntax error: missing ';' before 'return'; error C2001: newline is constant;
而且,如果我"???"换成像"细胞"这样的英文版,那就完美了;
如何在C中打印em dash?
其中之一: -
每当我这样做:printf("—")我只是ù在终端得到一个.
谢谢.
编辑:下面的代码应该打印出一个Xs和一个Os看起来网格与em破折号的水平线.
int main ()
{
char grid[3][3] = {{'a', 'a', 'a'}, {'a', 'a', 'a'}, {'a', 'a', 'a'}};
int i, j;
for (i = 0; i < 3; i++) {
for (j = 0; j < 3; j++) {
if (j != 0)
{
printf("|");
}
printf(" %c ", grid[i][j]);
}
if (i != 2)
{
printf("\n——————————————\n");
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:("ù"应为" - "s)
a | a | a
ùùùùùùùùùùùù …Run Code Online (Sandbox Code Playgroud) 我正在阅读有关 string 和 wstring 的众所周知的答案,并出现一些困惑。
\n\n源字符集和执行字符集均设置为utf-8,Windows x64,VC++编译器,git bash控制台(可以打印unicode字符),系统默认代码页936(GB2312)。
\n\n我的专业代码:
\n\n#include <cstring>\n#include <iostream>\nusing namespace std;\nint main(int argc, char* argv[])\n{\n wchar_t c[] = L"ol\xc3\xa9";\n wchar_t d[] = L"abc";\n wcout << c << endl;\n wcout << d << endl;\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n可以打印“abc”,但无法打印“\xc3\xa9”。
\n\n据我所知,它wchar_t与L前缀字符串文字一起使用。而在Windows下wchar_t是用UTF-16编码的(这是硬编码的吧?无论我选择什么源字符集或执行字符集,L"abc"总是有相同的UTF-16代码单元)。
问题是\xef\xbc\x9a怎么可能是wcoutUTF-16编码的字符串(“abc”),而我的源文件是utf-8,执行字符集是utf-8。除非我将所有内容都设置为 utf-16,否则该程序应该无法识别 UTF-16 编码的内容。
如果它可以以某种方式打印 UTF-16,那为什么它不能打印呢\xc3\xa9?