代码:
#include <stdio.h>
#include <wchar.h>
#define USE_W
int main()
{
#ifdef USE_W
const wchar_t *ae_utf16 = L"\x00E6 & ASCII text ae\n";
wprintf(ae_utf16);
#else
const char *ae_utf8 = "\xC3\xA6 & ASCII text ae\n";
printf(ae_utf8);
#endif
return 0;
}
输出:
ae&amp; ASCII文本ae
虽然printf产生正确的UTF-8输出:
æ&amp; ASCII文本ae
您可以测试此here。
答案 0 :(得分:1)
printf
只是将原始字节发送到您的终端;它对编码一无所知。如果您的终端配置为将其解释为UTF-8,它将显示正确的字符。
wprintf
确实知道编码。 behaves as though它使用函数wcrtomb,它将宽字符(wchar_t
)编码为多字节序列,取决于当前的语言环境。如果默认语言环境恰好是"C"
,这非常简约,则字符æ
将转换为“或多或少等效”的字节序列ae
。
如果您将语言环境明确设置为使用UTF-8的内容,例如"en_US.UTF-8"
,则输出is as expected。当然,受支持的语言环境集合因系统而异,因此对此进行硬编码并不好。