代码:
#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 & ASCII text ae
当 printf 产生正确的 UTF-8 输出时:
æ & ASCII text ae
你可以测试这个 here .
printf
只是将原始字节发送到您的终端;它对编码一无所知。如果您的终端恰好被配置为将其解释为 UTF-8,它将显示正确的字符。
另一方面,
wprintf
确实知道编码。它behaves as though它使用函数 wcrtomb ,它将宽字符 (wchar_t
) 编码为多字节序列,取决于当前的语言环境。如果默认语言环境恰好是 "C"
,这是非常简约的,字符 æ
将转换为“或多或少等效”的字节序列 ae
.
如果您将语言环境明确设置为使用 UTF-8 的内容,例如 "en_US.UTF-8"
,则输出 is as expected .当然,受支持的语言环境集因系统而异,因此对其进行硬编码是不好的。
我是一名优秀的程序员,十分优秀!