setlocale(LC_ALL,““) 中的 LC_* 是什么意思,以及 LANGUAGE/LANG 都是些啥?
这些都是个啥?
上面提到的种种,实际上都是 区域
设置相关的东西,因此今天我们所提到的东西都和区域
有关。
首先 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
或空字符串 ""
,则区域名称将根据环境变量值来设置,其名称与上述的类别名称相同。
一般程序遇到编码方面的问题,百度都会告诉你设置setlocale(LC_ALL,"")
来解决,下面我们就了解一下这句代码做了什么.
LC_ALL,LE_*
又是个啥?
实际上 LC_ALL,LE_*
是 区域
相关的环境变量。简而言之,LC_COLLATE,LC_TYPE
等等都是环境变量。
很多程序的运行行为在全球不同的地域、语言环境中是不一样的,例如Linux 中的 date
命令的行为就受LC_TIME
的影响:
$ LC_TIME=en_US.UTF-8 date
Fri Oct 31 19:51:16 CST 2014
$ LC_TIME=fi_FI.UTF-8 date
pe 31.10.2014 19.52.00 +0800
$ LC_TIME=zh_CN.UTF-8 date
2014年 10月 31日 星期五 19:53:07 CST
因此自然需要一些环境变量来告诉计算机用户所处的地区、语言等等,而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值
转自:https://blog.csdn.net/kunyus/article/details/104628559/