检查C语言中的语言环境

检查C语言中的语言环境,c,locale,C,Locale,我想检查我的系统是zh_TW.UTF-8还是zh_CN.UTF-8 使用以下代码,我可以看出它是UTF-8。 但是,我怎样才能知道它是zh_TW还是zh_CN #include <langinfo.h> #include <locale.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { //setlocale(LC_CTYPE,"");

我想检查我的系统是
zh_TW.UTF-8
还是
zh_CN.UTF-8

使用以下代码,我可以看出它是
UTF-8
。 但是,我怎样才能知道它是
zh_TW
还是
zh_CN

#include <langinfo.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
   //setlocale(LC_CTYPE,"");
   setlocale(LC_ALL,"");
   printf("%s\n",nl_langinfo(CODESET));
   printf("%s\n",nl_langinfo(CRNCYSTR));
   exit(EXIT_SUCCESS);
}
#包括
#包括
#包括
#包括
int
main(int argc,char*argv[])
{
//setlocale(LC_CTYPE,“”);
setlocale(LC_ALL,“”);
printf(“%s\n”,nl_langinfo(代码集));
printf(“%s\n”,nl_langinfo(CRNCYSTR));
退出(退出成功);
}

在类似POSIX的系统上,有一种简单的方法:尝试以下命令:


在类似POSIX的系统上,有一种简单的方法:尝试以下命令:

尝试:

然后,阅读。

尝试:

然后,读取。

该函数返回一个指针,指向包含区域设置信息的字符串。您可以复制它(但不能修改它,后续调用
setlocale()
可能会覆盖以前的值)。该字符串可用于以后再次设置区域设置

char *loc_str = setlocale(LC_ALL, "");

if (loc_str == 0)
    ...failed to set locale...
printf("LC_ALL = %s\n", loc_str);
如果您设置了一个类别,您将得到一个字符串,该字符串将允许您恢复该类别。您可以查看
LC\u COLLATE
并查看设置的内容:

char *loc_str = setlocale(LC_COLLATE, "");
if (loc_str == 0)
    ...failed to set locale...
printf("LC_COLLATE = %s\n", loc_str);
等等

它可能会也可能不会给你一个人类可读的值——但至少要通过实验看看它在使用什么

您还可以查看
LANG
环境变量或
LC.*
环境变量。

该函数返回一个指向包含区域设置信息的字符串的指针。您可以复制它(但不能修改它,后续调用
setlocale()
可能会覆盖以前的值)。该字符串可用于以后再次设置区域设置

char *loc_str = setlocale(LC_ALL, "");

if (loc_str == 0)
    ...failed to set locale...
printf("LC_ALL = %s\n", loc_str);
如果您设置了一个类别,您将得到一个字符串,该字符串将允许您恢复该类别。您可以查看
LC\u COLLATE
并查看设置的内容:

char *loc_str = setlocale(LC_COLLATE, "");
if (loc_str == 0)
    ...failed to set locale...
printf("LC_COLLATE = %s\n", loc_str);
等等

它可能会也可能不会给你一个人类可读的值——但至少要通过实验看看它在使用什么


您还可以查看
LANG
环境变量,或
LC.*
环境变量。

-1这是一种非常不便于移植的方式,可以实现非常便携的功能。查看我的答案。不要忘记错误检查
popen()
返回的
句柄。使用
locale-a
可以提供
setlocale()
无法提供的信息,即可用的locale列表。不知怎的,我错过了命令的存在,所以+1让我意识到它的存在。我同意
setlocale()
通常更适合于程序(但不是shell脚本),但不要忘记字符串的格式和内容是由实现定义的,可能不容易解释。-1这是一种非常不可移植的方式,可以实现难以置信的可移植性。查看我的答案。不要忘记错误检查
popen()
返回的
句柄。使用
locale-a
可以提供
setlocale()
无法提供的信息,即可用的locale列表。不知怎的,我错过了命令的存在,所以+1让我意识到它的存在。我同意
setlocale()
通常更适合于程序(但不是shell脚本),但不要忘记字符串的格式和内容是由实现定义的,可能不容易解释。我已经尝试了链接示例代码。获取以下结果
Locale为:C日期为:Wed Mar 7 17:05:39 2012货币符号为:-Locale为:LC_CTYPE=zh_TW.UTF-8;LC_NUMERIC=en_US.UTF-8;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=en_US.UTF-8;LC_NAME=en_US.UTF-8;LC_地址=en_US.UTF-8;LC_电话=en_US.UTF-8;LC_测量=en_US.UTF-8;LC_IDENTIFICATION=en_US.UTF-8日期是:Wed 07 Mar 2012 05:05:39 PM CST货币符号是:$
您知道要查看哪个语言环境类别吗?如果您知道需要
LC\u CTYPE
,请将代码更改为
printf(“%s\n”,setlocale(LC\u CTYPE)”),输出将是
zh_TW.UTF-8
,我不确定我是否知道。一般情况下,显示器的用途是什么?在我的系统中,我使用LANG=en_US.UTF-8 LC_CTYPE=zh_TW.UTF-8,这样我就可以输入中文,并且显示正确。但是,如果我发布我的程序,用户通常是LANG=zh_TW.UTF-8。获取以下结果
Locale为:C日期为:Wed Mar 7 17:05:39 2012货币符号为:-Locale为:LC_CTYPE=zh_TW.UTF-8;LC_NUMERIC=en_US.UTF-8;LC_TIME=en_US.UTF-8;LC_COLLATE=en_US.UTF-8;LC_MONETARY=en_US.UTF-8;LC_MESSAGES=en_US.UTF-8;LC_PAPER=en_US.UTF-8;LC_NAME=en_US.UTF-8;LC_地址=en_US.UTF-8;LC_电话=en_US.UTF-8;LC_测量=en_US.UTF-8;LC_IDENTIFICATION=en_US.UTF-8日期是:Wed 07 Mar 2012 05:05:39 PM CST货币符号是:$
您知道要查看哪个语言环境类别吗?如果您知道需要
LC\u CTYPE
,请将代码更改为
printf(“%s\n”,setlocale(LC\u CTYPE)”),输出将是
zh_TW.UTF-8
,我不确定我是否知道。一般情况下,显示器的用途是什么?在我的系统中,我使用LANG=en_US.UTF-8 LC_CTYPE=zh_TW.UTF-8,这样我就可以输入中文,并且显示正确。但是,如果我发布我的程序,用户通常是LANG=zh_TW.UTF-8。
char *loc_str = setlocale(LC_COLLATE, "");
if (loc_str == 0)
    ...failed to set locale...
printf("LC_COLLATE = %s\n", loc_str);