http://blog.csdn.net/koudaidai/article/details/7353772
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环境变量的值设置合适的值。
- #include <locale.h>
- #include <locale>
- using std::locale;
- int main()
- {
- setlocale(LC_CTYPE, "");
- // 使用当前locale,但numpunct使用缺省的,因此不会在输出数字时加上千位分隔符
- locale::global(locale("").combine<std::numpunct<char> >(locale::classic()));setlocale()的有效的locale串
在windows下可以用”.codepage”如”.936″来指定,linux下可以指定得更详细:”zh_CN.GB18030″。
windows下不能直接指定“GB18030”,可能只能用“GBK”。
-
先用setlocale()设置编码,再用nl_langinfo()进行检测
为检测当前语言环境是否使用了 UTF-8 编码。首先必须调用 setlocale(LC_CTYPE, “”) 函数,依据环境变量设置语言环境。nl_langinfo(CODESET) 函数也是由 locale charmap 命令调用,从而查找当前语言环境指定的编码名称。
- BOOL utf8_mode = FALSE;
- if(!strcmp(nl_langinfo(CODESET), "UTF-8")
- utf8_mode = TRUE;•直接查询环境变量
- 这项测试假设 UTF-8 语言环境名称中有值“UTF-8”,但实际情况并不总是如此,所以应该使用 nl_langinfo() 方法。
- char *s;
- BOOL utf8_mode = FALSE;
- if ((s = getenv("LC_ALL")) || (s = getenv("LC_CTYPE")) || (s = getenv ("LANG")))
- {
- if (strstr(s, "UTF-8"))
- utf8_mode = TRUE;
- }