如何在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是我试过的随机样本。