函數原型:char* setlocale (int category, const char* locale);函數
setlocale位於頭文件,setlocale() 函數既能夠用來對當前程序進行地域設置(本地設置、區域設置),也能夠用來獲取當前程序的地域設置信息,使用setlocale須要兩個參數編碼
第一個參數category:spa
用來設置地域設置的影響範圍。地域設置包含日期格式、數字格式、貨幣格式、字符處理、字符比較等多個方面的內容,當前的地域設置能夠隻影響某一方面的內容,也能夠影響全部的內容,操作系統
category 的值不能隨便設置,必須使用 <locale.h> 中定義的宏3d
第二個參數locale:指針
用來設置地域設置的名稱(字符串),也就是設置爲哪一種地域,對於不一樣的平臺和不一樣的編譯器,地域設置的名稱可能會不一樣,C語言標準沒有干預太多。C語言標準只是規定,各個組織在實現編譯器時至少要支持如下三個名稱:code
setlocale函數的返回值:blog
若是 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);
運行結果:
由於操做系統是中文環境,因此上面的代碼中能夠改成效果是同樣的