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 – 如果 localeNULL 或空字符串 "",则区域名称将根据环境变量值来设置,其名称与上述的类别名称相同。

一般程序遇到编码方面的问题,百度都会告诉你设置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 就可以打印所有相关的环境变量以及对应的值。

一般会包括:

  1. LC_CTYPE – 语言符号及其分类
  2. LC_NUMERIC – 数字
  3. LC_COLLATE – 比较和排序习惯
  4. LC_TIME – 时间显示格式
  5. LC_MONETARY – 货币单位
  6. LC_MESSAGES – 信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等
  7. LC_NAME – 姓名书写方式
  8. LC_ADDRESS – 地址书写方式
  9. LC_TELEPHONE – 电话号码书写方式
  10. LC_MEASUREMENT – 度量衡表达方式
  11. LC_PAPER – 默认纸张尺寸大小
  12. LC_IDENTIFICATION – 对locale自身包含信息的概述

一般认为由于区域和语言导致的不同习惯大致就是这12类。但是你从 linux 系统命令中输入 locale 获取到的结果可能不止这12个,还有LANGLANGUAGELC_ALL,那是这三个比较特殊。

  1. LANG – 是一个缺省值,所有没有显式设置值的LC_*变量都会取LANG的值。
  2. LANGUAGE – 的优先级比较高,会覆盖所有设置过的LC_*的值
  3. LC_ALL – 并不是一个环境变量,而是一个glibc中定义的一个宏,实际上则是调用了setlocale把所有的LC_*的变量设置了一遍

如何修改?

在程序中通过调用 setlocale(...) 来进行修改。

linux 中可以通过下面几种方式来修改:

  1. 创建或编辑/etc/locale.conf对系统级进行设置
  2. 创建或编辑~/.config/locale.conf对当前用户进行设置
  3. 在终端执行export LC_TIME=xxxx对当前终端进行设置
  4. 通过localectl命令来修改,比如localectl set-locale LANG=en_US.utf8

使用locale -a可以列出本机目前可以使用的值。locale -av还可以具体查看这些值更详细的信息。
  
变量生效的优先顺序从高到低如下:

  1. LANGUAGE 优先级最高,指定个人对语言环境值的主次偏好,例如 zh_CN:en_US:en,冒号分隔的是多种选择。
  2. LC_ALL 设置的值
  3. LC_* 可设定locale各方面的值,可以覆盖LANG的值。
  4. LANG 指定默认使用的locale值

转自:https://blog.csdn.net/kunyus/article/details/104628559/