Windows 下接受 UTF-8 参数的 printf 系列函数

前几天在微博上受到了 Belleve 给我的启发,于是简单地实现了几个在 Windows 下接受 UTF-8 参数的 printf 系列函数。大致思路是判断当前 stdout / stderr 是否为控制台,如果是控制台则将参数转为 UTF-16 后调用 wprintf 输出,否则不转换直接调用 printf。

前两天已经发了一篇文章,但后来测试发现了一些问题,然后我把那篇文章删掉了。结果后来发现是因为旧版的 Visual C++ 编译器不能很好的支持以 UTF-8 编码的源代码。更新了最新的 Visual Studio 2015 后,编译器有个 /utf-8 参数可以指定源代码文件是以 UTF-8 编码的,于是就没问题了。如果用 VS 工程,一定要设置好相应选项。至于老的 Visual C++ 编译器,我还没研究有什么办法。测试了 MinGW / MinGW-w64 和 Clang 都是没问题的。

现在代码已放 GitHub (不要吐槽没有 VS 工程文件或 Makefile,有空我给加上去……)

测试:

#include "uprintf.h"

int main(void)
{
uprintf("μ'sic forever!\n");
return 0;
}

以 UTF-8 保存上面的代码,编译,运行,可以正常打出「μ’sic forever!」。如果在 cmd 下用 > 重定向到文件,则文件编码为 UTF-8。

已知问题:不能在控制台下打印二进制字节。(我也不太清楚是否存在这样的使用场景)

目前还不知道有没有什么其他潜在问题,欢迎多多找茬。