我一直在测试将 Unicode 文本(如表情符号)写入 CLI 工具的控制台。我注意到,当使用 wprintf 输出表情符号时,它打印出两个问号 (��),但是当我使用 WriteConsoleW 时,它输出得很好。
测试代码(使用
/utf-8
使用 MSVC 和使用 -municode
使用 MinGW 编译)
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <Windows.h>
int wmain(int argc, const wchar_t *argv[]) {
_setmode(_fileno(stdout), _O_U16TEXT);
const wchar_t myString[] = L"😊\n";
wprintf(L"%s", myString);
WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), myString, wcslen(myString), NULL, NULL);
}
wprintf
函数系列与其 printf
类似函数有两个主要不同之处:
它们在格式字符串的语义解释上没有不同。特别是,
%s
转换说明符对 wprintf()
的含义与对 printf()
的含义完全相同:相应的参数是指向 char
数组的第一个元素的指针,而不是 wchar_t
。如果你想打印一个wide字符串,那么你需要使用适当的长度修饰符,产生%ls
。也就是说,
wprintf(L"%ls", myString);