setlocale()函数详解——C语言

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);
}

因为操作系统是中文环境,所以上面的代码中可以改为效果是一样的

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

相约天涯海角

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值