这些都是个啥?
上面提到的种种,实际上都是 区域 设置相关的东西,因此今天我们所提到的东西都和区域有关。
首先 setlocale(...) 是啥?
setLocale(...) 是C库中的一个设置地域化信息的C函数。
函数原型为:
1 | 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 或空字符串 "",则区域名称将根据环境变量值来设置,其名称与上述的类别名称相同。
一般程序遇到编码方面的问题,百度都会告诉你设置setlocale(LC_ALL,"")来解决,下面我们就了解一下这句代码做了什么.
LC_ALL,LE_* 又是个啥?
实际上 LC_ALL,LE_* 是 区域 相关的环境变量。简而言之,LC_COLLATE,LC_TYPE等等都是环境变量。
很多程序的运行行为在全球不同的地域、语言环境中是不一样的,例如Linux 中的 date命令的行为就受LC_TIME的影响:
1 | $ LC_TIME=en_US.UTF-8 date |
因此自然需要一些环境变量来告诉计算机用户所处的地区、语言等等,而locale是用来设置、查询、管理这些变量的linux命令。
那么 LE_* 都包含啥?
首先来看一些都有哪些需要设置的变量,通过在 linux 系统命令行中输入locale 就可以打印所有相关的环境变量以及对应的值。
一般会包括:
LC_CTYPE– 语言符号及其分类LC_NUMERIC– 数字LC_COLLATE– 比较和排序习惯LC_TIME– 时间显示格式LC_MONETARY– 货币单位LC_MESSAGES– 信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等LC_NAME– 姓名书写方式LC_ADDRESS– 地址书写方式LC_TELEPHONE– 电话号码书写方式LC_MEASUREMENT– 度量衡表达方式LC_PAPER– 默认纸张尺寸大小LC_IDENTIFICATION– 对locale自身包含信息的概述
一般认为由于区域和语言导致的不同习惯大致就是这12类。但是你从 linux 系统命令中输入 locale 获取到的结果可能不止这12个,还有LANG,LANGUAGE和LC_ALL,那是这三个比较特殊。
LANG– 是一个缺省值,所有没有显式设置值的LC_*变量都会取LANG的值。LANGUAGE– 的优先级比较高,会覆盖所有设置过的LC_*的值LC_ALL– 并不是一个环境变量,而是一个glibc中定义的一个宏,实际上则是调用了setlocale把所有的LC_*的变量设置了一遍
如何修改?
在程序中通过调用 setlocale(...) 来进行修改。
linux 中可以通过下面几种方式来修改:
- 创建或编辑
/etc/locale.conf对系统级进行设置 - 创建或编辑
~/.config/locale.conf对当前用户进行设置 - 在终端执行
export LC_TIME=xxxx对当前终端进行设置 - 通过
localectl命令来修改,比如localectl set-locale LANG=en_US.utf8
使用locale -a可以列出本机目前可以使用的值。locale -av还可以具体查看这些值更详细的信息。
变量生效的优先顺序从高到低如下:
LANGUAGE优先级最高,指定个人对语言环境值的主次偏好,例如zh_CN:en_US:en,冒号分隔的是多种选择。LC_ALL设置的值LC_*可设定locale各方面的值,可以覆盖LANG的值。LANG指定默认使用的locale值