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);
運行結果:

從上面可以看出當前編譯器使用的地域設置是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);
運行結果:

因為操作系統是中文環境,所以上面的代碼中
可以改為
效果是一樣的
