setLocale是C庫中的一個設置地域化信息的C函數。windows
函數原型爲:函數
char *setlocale(int category, const char *locale)
category -- 這是一個已命名的常量,指定了受區域設置影響的函數類別。測試
locale -- 若是locale是NULL 或空字符串"",則區域名稱將根據環境變量值來設置,其名稱與上述的類別名稱相同。編碼
最近項目中須要使用xdelta3進行二進制文件的增量更新,測試代碼輸入編碼爲GBK,printf輸出的中文也顯示正常,但xdelta3執行的結果就不盡如人意了。spa
如上圖,上面printf輸出的中文是正常的,下面xdelta輸出的結果就是亂碼的。code
問一同事,說寬字符能夠解決這個問題。測試顯示正常,以下圖。blog
經歷過一番經歷後,總算是解決了這個問題。字符串
作技術的人總喜歡尋根問底,因而大膽猜想是否是setLocale函數起了做用。因而修改測試代碼,寬字符改成普通字符,加上setLocale函數,再測,結果仍是正常的。原型
測試代碼以下圖:域名
總結:
windows環境下,setLocale會改變字符的編碼環境設置。有些應用程序依賴系統的編碼環境,則須要添加setLocale,來肯定合適的編碼環境。