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,来确定合适的编码环境。