setlocale() 对 macOS 没有影响

setlocale() has no effect on macOS

我在 macOS 10.14.6 系统上使用 the example program for setlocale() from cppreference.com,但是,输出未本地化。我检查了 setlocale() 中的 return 值不是 NULL 并尝试了各种语言环境规范以尝试获得小数点逗号,例如 dede_DE, de_DE.utf8.

为什么这不起作用?

如何找出输出不受影响的原因,以及是否是因为语言环境名称不正确?

在同一个 OS 上,来自 Python 的区域设置更改似乎有效(因为它们会影响同一进程中 C 代码 运行 的数字打印)。因此,我不认为问题是不支持此语言环境。


完整节目:

#include <stdio.h>
#include <locale.h>
#include <time.h>
#include <wchar.h>
 
int main(void)
{
    // the C locale will be UTF-8 enabled English;
    // decimal dot will be German
    // date and time formatting will be Japanese
    setlocale(LC_ALL, "en_US.UTF-8");
    setlocale(LC_NUMERIC, "de_DE.utf8");
    setlocale(LC_TIME, "ja_JP.utf8");
 
    wchar_t str[100];
    time_t t = time(NULL);
    wcsftime(str, 100, L"%A %c", localtime(&t));
    wprintf(L"Number: %.2f\nDate: %ls\n", 3.14, str);
}

在终端中,locale -a 可用于查看所有可用的语言环境。

在我的系统上1locale -a | grep de_ 产生以下结果

de_CH
de_DE.UTF-8
de_AT.ISO8859-1
de_AT.UTF-8
de_AT.ISO8859-15
de_DE.ISO8859-15
de_CH.UTF-8
de_DE-A.ISO8859-1
de_CH.ISO8859-15
de_DE.ISO8859-1
de_CH.ISO8859-1
de_AT
de_DE

setlocale returns NULL 如果参数组合没有意义。在我的系统上1,

#include <stdio.h>
#include <locale.h>
#include <time.h>
#include <wchar.h>

int main(void)
{
    // the C locale will be UTF-8 enabled English;
    // decimal dot will be German
    // date and time formatting will be Japanese
    char *all = setlocale(LC_ALL, "en_US.UTF-8");
    char *num = setlocale(LC_NUMERIC, "de_DE.utf8");
    char *tim = setlocale(LC_TIME, "ja_JP.utf8");

    printf("%s\n%s\n%s\n", all, num, tim);

    wchar_t str[100];
    time_t t = time(NULL);
    wcsftime(str, 100, L"%A %c", localtime(&t));
    wprintf(L"Number: %.2f\nDate: %ls\n", 3.14, str);
}

产出

en_US.UTF-8
(null)
(null)
Number: 3.14
Date: Thursday Thu May 12 08:35:37 2022

使用先前列表中的语言环境

#include <stdio.h>
#include <locale.h>
#include <time.h>
#include <wchar.h>

int main(void)
{
    // the C locale will be UTF-8 enabled English;
    // decimal dot will be German
    // date and time formatting will be Japanese
    char *all = setlocale(LC_ALL, "en_US.UTF-8");
    char *num = setlocale(LC_NUMERIC, "de_DE.UTF-8");
    char *tim = setlocale(LC_TIME, "ja_JP.UTF-8");

    printf("%s\n%s\n%s\n", all, num, tim);

    wchar_t str[100];
    time_t t = time(NULL);
    wcsftime(str, 100, L"%A %c", localtime(&t));
    wprintf(L"Number: %.2f\nDate: %ls\n", 3.14, str);
}

产出

en_US.UTF-8
de_DE.UTF-8
ja_JP.UTF-8
Number: 3,14
Date: 木曜日 木  5/12 08:37:51 2022

1注意这是在macOS10.15.7上测试的。 macOS 10.14.6 上的结果可能不同。你不应该盲目相信你找到的例子,包括我在这里,而是检查你自己系统的语言环境。

locale 自 Mac OS X 10.4.

以来可用