gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:52:36 25 4
gpt4 key购买 nike

代码:

#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 .当然,受支持的语言环境集因系统而异,因此对其进行硬编码是不好的。

关于c - 为什么 wprintf 将 Unicode 连字分成两个不同的字素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15874715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com