2

代码:

#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 文本 ae

虽然 printf 产生正确的 UTF-8 输出:

æ & ASCII 文本 ae

你可以在这里测试一下。

4

1 回答 1

1

printf只是将原始字节发送到您的终端;它对编码一无所知。如果您的终端碰巧被配置为将其解释为 UTF-8,它将显示正确的字符。

wprintf,另一方面,确实知道编码。它的行为就像它使用函数wcrtomb 一样,该函数将宽字符 ( wchar_t) 编码为多字节序列,具体取决于当前的 locale。如果默认语言环境恰好是"C",这是非常简约的,则字符æ将转换为“或多或少等效”的字节序列ae

如果您将语言环境明确设置为使用 UTF-8 的内容,例如"en_US.UTF-8",则输出符合预期。当然,每个系统支持的语言环境集是不同的,所以硬编码是不好的。

于 2013-04-08T10:23:17.013 回答