为什么wprintf将Unicode连字分成两个不同的字形?

时间:2013-04-08 08:39:18

标签: c unicode wchar ligature

代码:

#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

1 个答案:

答案 0 :(得分:1)

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

另一方面,

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

如果您将语言环境明确设置为使用UTF-8的内容,例如"en_US.UTF-8",则输出is as expected。当然,受支持的语言环境集合因系统而异,因此对此进行硬编码并不好。