gpt4 book ai didi

c - setlocale() 没有按预期工作

转载 作者:太空宇宙 更新时间:2023-11-04 06:21:58 26 4
gpt4 key购买 nike

以下程序使用 setlocale() 从环境变量中获取区域设置,并打印时间。

locale_test.c:

// locale test

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

// locale test
void locale_test() {
// use environment variable to get locale setting,
setlocale(LC_ALL, "");

char buf[26];
time_t now = time(NULL);
ctime_r(&now, buf);
printf("time: %s", buf);

char *time_locale = setlocale(LC_TIME, NULL);
printf("current LC_TIME locale: %s\n", time_locale);
}

int main(int argc, char *argv[]) {
locale_test();
return 0;
}

执行:

  • LC_ALL=fr_FR LC_TIME=fr_FR ./a.out,输出为:

    time: Wed Oct 14 13:16:35 2015
    current LC_TIME locale: C

  • LC_ALL=en_US LC_TIME=en_US ./a.out,输出为:

    time: Wed Oct 14 13:17:12 2015
    current LC_TIME locale: C

问题是:

  • 2次执行的结果应该是不同的格式,由于不同的语言环境,但它们是一样的,为什么?
  • 当尝试获取当前的 LC_TIME 时,它只打印 C,而不是从环境变量指定的值。

更新 - 解决方案:

根据评论和回答,进行了以下更改:

  • 使用 locale -a
  • 结果中的正确区域设置名称
  • 使用 strftime() 代替 ctime() 生成时间字符串

新程序:

// locale test

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

// locale test
void locale_test() {
// use environment variable to get locale setting,
if(setlocale(LC_ALL, "") == NULL) {
printf("error while setlocale()\n");
}

// get current LC_TIME
char *time_locale = setlocale(LC_TIME, NULL);
if(time_locale == NULL) {
printf("error while setlocale()\n");
} else {
printf("LC_TIME: %s\n", time_locale);
}

// print time in locale,
size_t buf_size = 50;
char buf[buf_size];
// char *format = "%F %T %z";
char *format = "%A, %d %B %Y, %H:%M:%S %Z";

time_t now = time(NULL);
struct tm tm_now;
localtime_r(&now, &tm_now);

strftime(buf, buf_size, format, &tm_now);
printf("time: %s\n", buf);
}

int main(int argc, char *argv[]) {
locale_test();
return 0;
}

然后执行:

  • LC_ALL=en_US.utf8 LC_TIME=en_US.utf8 ./a.out,输出为:

    LC_TIME: en_US.utf8
    time: Wednesday, 14 October 2015, 16:36:36 CST

  • LC_ALL=zh_CN.utf8 LC_TIME=zh_CN.utf8 ./a.out,输出为:

    LC_TIME: zh_CN.utf8
    time: 星期三, 14 十月 2015, 16:38:10 CST

  • LC_ALL=en_US.utf8 LC_TIME=en_US.utf8 ./a.out,输出为:

    LC_TIME: ja_JP.utf8
    time: 水曜日, 14 10月 2015, 16:40:05 CST

这是预期的工作。

最佳答案

您必须检查 setlocale 的返回值,因为如果 locale 字符串无效、未安装您想要的 locale 或其他一些原因,它将失败。

if (setlocale(LC_ALL, "") == NULL) {
puts("Unable to set locale");
}

您可以使用 locale -a 检查可用的语言环境。也许您确实安装了法语语言环境,但您必须使用 fr_FR.utf8 进行设置。

然后,ctime 输出不依赖于区域设置; standard指定其确切格式,并且始终为英文。对于本地化输出,请改用 strftime

关于c - setlocale() 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33117258/

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