wprintf 无法正确输出表情符号字符,但 WriteConsoleW 可以

问题描述 投票:0回答:1

我一直在测试将 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);
}

输出:

c winapi
1个回答
0
投票

wprintf
函数系列与其
printf
类似函数有两个主要不同之处:

  • 他们希望以宽字符串的形式提供格式,并且
  • 他们期望输出媒介是广泛的

它们在格式字符串的语义解释上没有不同。特别是,

%s
转换说明符对
wprintf()
的含义与对
printf()
的含义完全相同:相应的参数是指向
char
数组的第一个元素的指针,而不是
wchar_t
。如果你想打印一个wide字符串,那么你需要使用适当的长度修饰符,产生
%ls
。也就是说,

    wprintf(L"%ls", myString);
© www.soinside.com 2019 - 2024. All rights reserved.