setLocale的一個用處


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,來確定合適的編碼環境。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM