我一直在尝试使用printf打印unicode字符串。我看了一些其他的答案设置语言环境,也设置控制台输出的窗口使用SetConsoleOutputCP。然而,有一个问题,我找不到答案。这里是代码样本测试。
#include <stdio.h>
#include <locale.h>
#include <windows.h>
int main()
{
setlocale(LC_ALL, "en_US.UTF-8");
SetConsoleOutputCP(CP_UTF8);
printf("È\n"); // <-- This line prints È as expected
printf("\u00C8\n"); // <-- This line does not print anything at all, not even a new line
return 0;
}
正如评论中提到的printf("\u00C8\n");
在windows上不打印任何东西,但在Linux上可以完美地工作。我想知道为什么以及如何让它打印适当的unicode字符。
1条答案
按热度按时间lf3rwulv1#
字符
\u00C8
(带抑音符的拉丁大写字母E)的UTF-8编码是\xc3\x88
,因此对于使用UTF-8的编译器,"È\n"
和"\u00C8\n"
都等价于"\xc3\x88\n"
。如果使用MSVC,那么默认情况下
"\u00C8\n"
不会生成UTF-8字符串。MSVC使用 default codepage。如果使用CP-1252,那么字符\u00C8
的代码恰好是\xc8
,并且该代码被插入到字符串中。显然,它在UTF-8 codepage.Demo中不起作用。您需要使用
/utf-8
编译器开关使MSVC从通用字符名称生成UTF-8字符。如果这样做,则“\u00C8\n”和"È\n"
将生成完全相同的字符串(前提是您的源文件是UTF-8编码的)。Demo