setLocale是C庫中的一個設置地域化信息的C函數。
函數原型為:
char *setlocale(int category, const char *locale)
參數解釋:
-
category -- 這是一個已命名的常量,指定了受區域設置影響的函數類別。
- LC_ALL 包括下面的所有選項。
- LC_COLLATE 字符串比較。參見 strcoll()。
- LC_CTYPE 字符分類和轉換。例如 strtoupper()。
- LC_MONETARY 貨幣格式,針對 localeconv()。
- LC_NUMERIC 小數點分隔符,針對 localeconv()。
- LC_TIME 日期和時間格式,針對 strftime()。
- LC_MESSAGES 系統響應。
-
locale -- 如果locale是NULL 或空字符串"",則區域名稱將根據環境變量值來設置,其名稱與上述的類別名稱相同。
最近項目中需要使用xdelta3進行二進制文件的增量更新,測試代碼輸入編碼為GBK,printf輸出的中文也顯示正常,但xdelta3執行的結果就不盡如人意了。

如上圖,上面printf輸出的中文是正常的,下面xdelta輸出的結果就是亂碼的。
問一同事,說寬字符可以解決這個問題。測試顯示正常,如下圖。

經歷過一番經歷后,總算是解決了這個問題。
做技術的人總喜歡尋根問底,於是大膽猜測是不是setLocale函數起了作用。於是修改測試代碼,寬字符改為普通字符,加上setLocale函數,再測,結果還是正常的。
測試代碼如下圖:

總結:
windows環境下,setLocale會改變字符的編碼環境設置。有些應用程序依賴系統的編碼環境,則需要添加setLocale,來確定合適的編碼環境。
