烦恼一般都是想太多了。

0%

了解locale环境变量

locale 可以用几个环境变量来改变。当然,之前在 TLPI 上看到过,但是都忘记得差不多了。正好遇到了,macOS 中在 vim 用 + 寄存器复制出来的中文是乱码的。所以需要了解一下。
locale 被位置敏感的程序用来渲染文字,正确的显示货币值,时间和日期的格式等等。

原因

macOS 在英文界面的时候,我查看了一下 locale 相关的变量:

$ locale
LANG=
LC_COLLATE="C"
LC_CTYPE="UTF-8"
LC_MESSAGES="C"
LC_MONETARY="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_ALL=

再切换到中文界面:

$ locale
LANG="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_CTYPE="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_ALL=

看来影响的原因就是因为 locale 设置的问题。

格式

locale 的格式类似 language[_territory][.codeset][@modifier]。 例如 : zh_CN.UTF-8

变量解释

LANG

安装的默认 locale。

在没有设置 LC_* 变量的情况下,就会使用 LANG 变量。

  • LCALL 覆盖 LANG 及其他 LC* 变量的设置。
  • LC_COLLATE 影响用来排序和正则式的规则。设置为 C 会让 ls 命令将 . 放在前面,大写的比小写的更前面。
  • LC_TIME 时间日期格式。
  • LC_CTYPE 代表 正则 表达式 匹配, 字符类(character classification), 转换, 区分大小写 的 比较, 以及 宽字符 函数.
  • LC_MESSAGES 代表 可以 本地化的 消息 (自然语言)
  • LC_MONETARY 代表 货币 格式.
  • LC_NUMERIC 代表 数字 格式 (比如 小数点 和 千位分组符).

设置

Linux 上有两个命令 locale/localectl 来进行设置 locale。

  • locale 用来查看相关的 locale 信息,支持的语言,字符集
  • localectl 就用来设置对应的 locale 了。

我们可以利用设置 L_ALL 或者 LANG 变量了更改语言和字符集。

localectl  set-locale LANG=zh_CN.utf8

然后退出重新登录。

locale
LANG=zh_CN.utf8
LC_CTYPE="zh_CN.utf8"
LC_NUMERIC="zh_CN.utf8"
LC_TIME="zh_CN.utf8"
LC_COLLATE="zh_CN.utf8"
LC_MONETARY="zh_CN.utf8"
LC_MESSAGES="zh_CN.utf8"
LC_PAPER="zh_CN.utf8"
LC_NAME="zh_CN.utf8"
LC_ADDRESS="zh_CN.utf8"
LC_TELEPHONE="zh_CN.utf8"
LC_MEASUREMENT="zh_CN.utf8"
LC_IDENTIFICATION="zh_CN.utf8"
LC_ALL=