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串
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 命令调用,从而查找当前语言环境指定的编码名称。
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;
}