如何在C ++中打印Unicode字符?
我正在试图打印一个俄文“ф”( U + 0444 CYRILLIC SMALL LETTER EF)字符,该字符被赋予十进制数1092 。 使用C ++,我怎样才能打印出这个字符? 我会认为沿着下面的路线的东西会工作,但…
int main (){ wchar_t f = '1060'; cout << f << endl; }
要表示字符,您可以使用通用字符名称(UCN)。 字符'ф'具有Unicode值U + 0444,所以在C ++中可以写成'\ u0444'或'\ U00000444'。 另外,如果源代码编码支持这个字符,那么你可以直接写在你的源代码。
// both of these assume that the character can be represented with // a single char in the execution encoding char b = '\u0444'; char a = 'ф'; // this line additionally assumes that the source character encoding supports this character
打印这些字符取决于您打印的内容。 如果要打印到Unixterminal仿真程序,则terminal仿真程序正在使用支持该字符的编码,并且该编码与编译器的执行编码相匹配,则可以执行以下操作:
#include <iostream> int main() { std::cout << "Hello, ф or \u0444!\n"; }
这个程序不要求“ф”可以用一个字符表示。 在OS X和大多数现代Linux安装上,这将会工作得很好,因为源代码,执行代码和控制台编码都将是UTF-8(它支持所有的Unicode字符)。
Windows的事情比较困难,而且有不同的权衡。
可能是最好的,如果你不需要可移植的代码(你将使用wchar_t,在其他平台上应该避免这种情况),就是将输出文件句柄的模式设置为只接受UTF-16数据。
#include <iostream> #include <io.h> #include <fcntl.h> int main() { _setmode(_fileno(stdout), _O_U16TEXT); std::wcout << L"Hello, \u0444!\n"; }
便携式代码更难。
最终,这完全取决于平台。 在C ++中Unicode的支持不幸的是非常糟糕。 对于GCC,你将不得不使它成为一个窄string,因为他们使用UTF-8,而Windows需要一个宽string,并且你必须输出到wcout
。
// GCC std::cout << "ф"; // Windoze wcout << L"ф";
用-std=c++11
编译时,可以简单地
const char *s = u8"\u0444"; cout << s << endl;
如果你使用Windows(注意,我们使用的是printf(),而不是cout):
//Save As UTF8 without signature #include <stdio.h> #include<windows.h> int main (){ SetConsoleOutputCP(65001); printf("ф\n"); }
不是Unicode,但工作 – 1251而不是UTF8:
//Save As Windows 1251 #include <iostream> #include<windows.h> using namespace std; int main (){ SetConsoleOutputCP(1251); cout << "ф" << endl; }
'1060'
是四个字符,不会在标准下编译。 如果您的宽字符与Unicode 1:1匹配(请检查您的语言环境设置),则应该将字符视为数字。
int main (){ wchar_t f = 1060; wcout << f << endl; }
在Linux中,我可以这样做:
std::cout << "ф";
我只是从这里复制粘贴的字符,并没有失败,至less是我试过的随机样本。