setlocale()函数详解——C语言
setlocale函数
函数原型:char* setlocale (int category, const char* locale);
setlocale位于头文件,setlocale() 函数既可以用来对当前程序进行地域设置(本地设置、区域设置),也可以用来获取当前程序的地域设置信息,使用setlocale需要两个参数
第一个参数category:
-
LC_ALL
影响所有内容 -
LC_COLLATE
影响字符比较(字符排序), 具体就是影响<string.h>头文件中的stroll()和strxfrm()函数。在默认地域设置为“c”,比较字符带大小实际比较的显字符的内码,C语言一般使用ASCII编码。此时比较早的字符ASCII码值;但在其它的地域设置中,可能会有不同的比较方式,例如在中文环境中剋有按照拼音对字符进行 比较和排序 -
LC_CTYPE
1)影响字符分类和字符转换,具体影响<ctype.h>和<wctype.h>文件中的函数。
例如,在默认低于设置中(设置为“C”),只有abc...xyzABC...XYZ
下被认为是字母;带式在其他地域设置中,可能会包含更多的字母,例如在中文环境下、拉丁文
、希腊文``(数学物理公式中常有希腊字母)等即使在特定的地域设置下,一个字母是否是字母还跟操作系统有关系,例如在中文环境下,罗马数字ⅠⅡⅢⅤ
将被window和linux视为字母,但是Mac os 就不认为为字母;2)还会游行某些多字符和宽字符处理函数,例如
mbtowc() mbstiwsc()
等。不过实际测试中,暂时未发现函数会受到LC_CTYE的影响。
注 : LC_CTYPE影响范围最大,是地域设置中最重要的一项功能。
-
LC_MONETARY
影响货币,包括货币符号、国际货币diamagnetic等;货币信息可以从localeconv()
返回lconv结构中的取得;
例如,美元符号$
,国际代码是USD
;人民币是¥
,国际代码是CNY
-
LC_NUMERIC
影响数字的更是,数字小数点(用那个字符来表示小数点)、数字分组等。 -
LC_TIME
影响时间格式,具体影响strftime()函数行为。
例如,美国为月/日/年,大陆地区书写格式是年/月/日
第二个参数locale
- “C”
默认的地域设置,C语言程序启动时就使用“C”地域设置,也就相当于调用setlocal(LC_ALL, "C")
。
"C"
是一种非常中立的地域设置,不偏向任何一个地区,他会尽量少的包含地域信息,这些信息只是让C语言能够正常运行,大多数情况下,"C"
仅仅是对小数点进行了设置(设置为.),其信息被设置为空 - “”
使用当前操作系统默认的地域设置。
并不是所有的编译器都很好的支持"", 例如,Xcode下的LLVM编译器就不支持设置为""
- NULL
不指定任何名称,此时setlocale()
不会对地域设置进行任何的修改,仅仅是返回当前地域的名称。
用来设置地域设置的名称(字符串),也就是设置为哪种地域,对于不同的平台和不同的编译器,地域设置的名称可能会不同,C语言标准没有干预太多。C语言标准只是规定,各个组织在实现编
setlocale函数的返回值
如果 setlocale() 执行成功,那么返回一个指向字符串的指针,该字符串包含了当前地域设置的名称。也就是说,setlocale() 会将当前地域设置的名称返回
如果 setlocale() 执行失败(例如为 locale 指定的名称不存在,就会导致地域设置失败),那么返回空指针NULL
如果程序中没有用setlocale函数设置地域等其他参数,那么程序运行时locale 被初始化为默认的 C locale,其采用的字符编码是所有本地 ANSI 字符集编码的公共部分,是用来书写C语言源程序的最小字符集,
下面用setlocale来得到当前使用的地域设置
#include <stdio.h>
#include <locale.h>
int main(int argc, char * argv[])
{
char *p;
p = setlocale(LC_ALL, NULL);
printf("%s\n", p);
}
从上面可以看出当前编译器使用的地域设置是C,如果想用宽字符来输出中文,却仍然使用默认的地域设置(C)就会出现问题,下面尝试用setlocale来解决宽字符输出中文的问题
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
int main(int argc, char * argv[])
{
wchar_t ss[20];
char *p;
p = setlocale(LC_ALL, NULL);
ss[0] = _T('中');
ss[2] = _T('\0');
wprintf(L"%ls\n", ss);
printf("地域设置:%s\n", p);
}
从上面的运行结果可以看出’中’ '文’两个字并没有被正确的输出,因为locale被初始化为默认的C,其采用的字符编码是所有本地ANSI字符集编码的公共部分,是用来书写C语言源程序的最小字符集,下面用setlocale来把地域设置为简体中文,修改后的代码如下:
#include <stdio.h>
#include <locale.h>
#include <wchar.h>
int main(int argc, char * argv[])
{
wchar_t ss[20];
char *p;
p = setlocale(LC_ALL, "");
ss[1] = _T('文');
ss[2] = _T('\0');
wprintf(L"%ls\n", ss);
printf("地域设置:%s\n", p);
}
因为操作系统是中文环境,所以上面的代码中可以改为效果是一样的