setlocale() 中语言环境的预期格式到底是什么?

What exactly is the expected format of the locale in setlocale()?

如果我使用 fputws 而没有 setlocale,则只会打印 ASCII 字母。看来setlocale是必须的,根据this sitesetlocale(LC_CTYPE, "UTF-8")setlocale(LC_CTYPE, "en_us.UTF-8")都可以。

但是我试了一下,setlocale(LC_CTYPE, "UTF-8")不行,打印的是“Hello”。只有 setlocale(LC_CTYPE, "en_us.UTF-8"),我得到“你好ねこ 2”。我看了那个页面上的评论,他还说“UTF-8”不起作用(他用的是 GCC,我用的是 VC++)。我看了一些手册页,但他们没有具体说明格式应该是什么。在 CPP reference, the example is using only formats like "en_US.UTF-8", but on tutorials point 上,示例使用类似“en_GB”的格式。

setlocale(LC_CTYPE, "UTF-8") 正确吗?

setlocale(LC_CTYPE, "UTF-8");
//setlocale(LC_CTYPE, "en_us.UTF-8");
FILE* output = _wfopen(L"output.txt", L"w");
fputws(L"Hello ねこ 2", output);
fclose(output);

答案是系统特定的。引用您链接到的 cppreference 页面:

system-specific locale identifier. Can be "" for the user-preferred locale or "C" for the minimal locale

认为“UTF-8”通常是无效的语言环境名称(它至少需要语言标识符,但不是 100%)。但是,通常您会希望简单地使用“”来默认用户偏好(我希望这对于显示他们的输入是正确的)。