setlocale() 对 macOS 没有影响
setlocale() has no effect on macOS
我在 macOS 10.14.6 系统上使用 the example program for setlocale()
from cppreference.com,但是,输出未本地化。我检查了 setlocale()
中的 return 值不是 NULL
并尝试了各种语言环境规范以尝试获得小数点逗号,例如 de
、de_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
可用于查看所有可用的语言环境。
在我的系统上1,locale -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.
以来可用
我在 macOS 10.14.6 系统上使用 the example program for setlocale()
from cppreference.com,但是,输出未本地化。我检查了 setlocale()
中的 return 值不是 NULL
并尝试了各种语言环境规范以尝试获得小数点逗号,例如 de
、de_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
可用于查看所有可用的语言环境。
在我的系统上1,locale -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.