C++中的locale设置

C/C++程序中,locale将决定程序所使用的当前语言编码、日期格式、数字格式及其它与区域有关的设置,locale设置的正确与否将影响到程序中字符串处理(wchar_t如何输出、strftime()的格式等)。因此,对于每一个程序,都应该慎重处理locale设置。

C locale和C++ locale是独立的。C locale用setlocale(LC_CTYPE, “”)初始化,
C++ locale用std::locale::global(std::locale(“”))初始化。这样就可以根据当前运行环境正确设置locale。

根据环境变量中设置编码信息

使用第二个参数为”"的setlocale()调用会自动根据LC_ALL、LC_CTYPE和LANG环境变量的值设置合适的值。

[cpp]  view plain copy
  1. #include <locale.h>  
  2. #include <locale>  
  3.   
  4. using std::locale;  
  5.   
  6. int main()  
  7. {  
  8.     setlocale(LC_CTYPE, "");  
  9.   
  10.     // 使用当前locale,但numpunct使用缺省的,因此不会在输出数字时加上千位分隔符  
  11.     locale::global(locale("").combine<std::numpunct<char> >(locale::classic()));setlocale()的有效的locale串  

setlocale()的有效的locale串

在windows下可以用”.codepage”如”.936″来指定,linux下可以指定得更详细:”zh_CN.GB18030″。

windows下不能直接指定“GB18030”,可能只能用“GBK”。

检测当前的语言环境是否使用了 UTF-8 编码
  • 先用setlocale()设置编码,再用nl_langinfo()进行检测

为检测当前语言环境是否使用了 UTF-8 编码。首先必须调用 setlocale(LC_CTYPE, “”) 函数,依据环境变量设置语言环境。nl_langinfo(CODESET) 函数也是由 locale charmap 命令调用,从而查找当前语言环境指定的编码名称。

[cpp]  view plain copy
  1. BOOL utf8_mode = FALSE;  
  2. if(!strcmp(nl_langinfo(CODESET), "UTF-8")  
  3.   
  4.    utf8_mode = TRUE;•直接查询环境变量   
  5.   
  6. 这项测试假设 UTF-8 语言环境名称中有值“UTF-8”,但实际情况并不总是如此,所以应该使用 nl_langinfo() 方法。  
  7.   
  8.   
  9. char *s;  
  10. BOOL utf8_mode = FALSE;  
  11. if ((s = getenv("LC_ALL")) || (s = getenv("LC_CTYPE")) || (s = getenv ("LANG")))  
  12.   
  13. {  
  14.     if (strstr(s, "UTF-8"))  
  15.         utf8_mode = TRUE;  
  16.   

  1. }  

上文来自:http://blog.csdn.net/koudaidai/article/details/7353772

你可能感兴趣的:(C++,c,VC)