setlocale()函数详解——C语⾔
setlocale函数
函数原型:char* setlocale (int category, const char* locale);
setlocale位于头⽂件,setlocale() 函数既可以⽤来对当前程序进⾏地域设置(本地设置、区域设置),也可以⽤来获取当前程序的地域设置信息,使⽤setlocale需要两个参数
第⼀个参数category:
⽤来设置地域设置的影响范围。地域设置包含⽇期格式、数字格式、货币格式、字符处理、字符⽐较等多个⽅⾯的内容,当前的地域设置可以只影响某⼀⽅⾯的内容,也可以影响所有的内容,
category 的值不能随便设置,必须使⽤ <locale.h> 中定义的宏
第⼆个参数locale:
⽤来设置地域设置的名称(字符串),也就是设置为哪种地域,对于不同的平台和不同的编译器,地域设置的名称可能会不同,C语⾔标准没有⼲预太多。C语⾔标准只是规定,各个组织在实现编译器时⾄少要⽀持以下三个名称:
setlocale函数的返回值:
如果 setlocale() 执⾏成功,那么返回⼀个指向字符串的指针,该字符串包含了当前地域设置的名称。也就是说,setlocale() 会将当前地域设置的名称返回
如果 setlocale() 执⾏失败(例如为 locale 指定的名称不存在,就会导致地域设置失败),那么返回空指针NULL
如果程序中没有⽤setlocale函数设置地域等其他参数,那么程序运⾏时locale 被初始化为默认的 C locale,其采⽤的字符编码是所有本地ANSI 字符集编码的公共部分,是⽤来书写C语⾔源程序的最⼩字符集,
下⾯⽤setlocale来得到当前使⽤的地域设置
char *p;
p = setlocale(LC_ALL, NULL);
printf("%s\n", p);
运⾏结果:
库函数printf详解从上⾯可以看出当前编译器使⽤的地域设置是C,如果想⽤宽字符来输出中⽂,却仍然使⽤默认的地域设置(C)就会出现问题,下⾯尝试⽤setlocale来解决宽字符输出中⽂的问题
wchar_t ss[20];
char *p;
p = setlocale(LC_ALL, NULL);
ss[0] = _T('中');
ss[1] = _T('⽂');
ss[2] = _T('\0');
wprintf(L"%ls\n", ss);
printf("地域设置:%s\n", p);
运⾏结果:
从上⾯的运⾏结果可以看出'中' '⽂'两个字并没有被正确的输出,因为locale被初始化为默认的C,其采⽤的字符编码是所有本地ANSI字符集编码的公共部分,是⽤来书写C语⾔源程序的最⼩字符集,下⾯⽤setlocale来把地域设置为简体中⽂,修改后的代码如下:
wchar_t ss[20];
char *p;
p = setlocale(LC_ALL, "");
ss[0] = _T('中');
ss[1] = _T('⽂');
ss[2] = _T('\0');
wprintf(L"%ls\n", ss);
printf("地域设置:%s\n", p);
运⾏结果:
因为操作系统是中⽂环境,所以上⾯的代码中可以改为效果是⼀样的