Linux下通过locale来设置字符集
2013-10-06 22:28:25 阿炯

在Linux中通过locale指令来设置程序运行的不同语言环境,locale由ANSI C提供支持。locale的命名规则为<语言>_<地区>.<字符集编码>,如zh_CN.UTF-8,zh代表中文,CN代表大陆地区,UTF-8表示字符集。在locale环境中,有一组变量,代表国际化环境中的不同设置,内容如下:

各个LC_环境变量含义
优先级:LC_ALL > LC_* >LANG

名称:含义
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自身包含信息的概述

下面展开详述:

1、LC_COLLATE
定义该环境的排序和比较规则

2、LC_CTYPE
用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。是最重要的一个环境变量。

3、LC_MONETARY
货币格式

4、LC_NUMERIC
非货币的数字显示格式

5、LC_TIME
时间和日期格式

6、LC_MESSAGES
提示信息的语言。另外还有一个LANGUAGE参数,它与LC_MESSAGES相似,但如果该参数一旦设置,则LC_MESSAGES参数就会失效。LANGUAGE参数可同时设置多种语言信息,如

LANGUANE=”zh_CN.GB18030:zh_CN.GB2312:zh_CN”。

7、LANG
LC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值。类似于 LC_ALL。

8、LC_ALL
它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响,通常情况下,它是值为空。

下面是所有的相关的locale标识的原义:

LANG Determines the default locale in the absence of other locale related environment variables

LANGUAGE

LC_ADDRESS Convention used for formatting of street or postal addresses

LC_ALL High precedence override for locale specific behaviour (overrides all other locale variables)

LC_COLLATE Collation order

LC_CTYPE Character classification and case conversion

LC_MONETARY Monetary formatting

LC_MEASUREMENT Default measurement system used within the region

LC_MESSAGES Format of interactive words and responses

LC_NUMERIC Numeric formatting

LC_PAPER Default paper size for region

LC_RESPONSE Determines how responses (such as Yes and No) appear in the local language

LC_TELEPHONE Conventions used for representation of telephone numbers

LC_TIME Date and time formats

如果这个变量没有被设置,则会使用默认locale。Linux下一般为"POSIX",而BSD系统下多为"C"。"C"是系统默认的locale,"POSIX"多为"C"的别名,所以当我们新安装完一个系统时,默认的locale就是C或POSIX。

临时修改当前终端为locale为gbk的中文编码:
export export LC_ALL=zh_CN.GBK

当然是否能正常显示或处理中文还与连接的终端工具的会话设置有关。

在CentOS中配置locales的方法:

安装中文支持包:

yum groupinstall chinese-support

修改字符编码配置,没有这个文件(/etc/sysconfig/i18n)就创建它:
LANG="zh_CN.GBK"
SUPPORTED=zh_CN.UTF-8:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="latarcyrheb-sun16"

i18n文件是用来设置系统语言,比如:zh_CN.UTF-8、zh_CN.GBk、zh_TW.Big5、en_US.UTF-8等。

i18n中三个环境变量:
LANG变量,设置系统语言。

SUPPORTED变量决定系统支持的语言,即系统能够显示的语言。

SYSFONT变量表示系统字体。

配置完成后重启服务器后可完成。

在Debian中安装与设定locale的方法:

通过'apt-get install locales'命令安装locales包,如果还是没有(通过locales -a查看)或显示不完全,就需要安装(新版本中)'locales-all'包。

安装完成locales包后,系统会自动进行locale配置,你只要选择所需的locale,可以多选,最后指定一个系统默认的locale。这样系统就会帮你自动生成相应的locale和配置好系统的locale。

增加或修改新的locale也很简单,用dpkp-reconfigure locales重置locale即可。

也可手动增加locale,只要把新的locale增加到/etc/locale.gen文件中,再运行locale-gen命令即可生成新的 locale;再通过设置上面介绍的LC_*变量就可设置系统的locale了。下面是一个locale.gen文件的样例:
zh_CN.GBK GBK
zh_CN.UTF-8 UTF-8

要在Shell中正常显示系统的中文提示信息和支持中文输入,LANG和shell的编码配置需一致,并安装有中文locale。如:LANG和 shell的编码都配置成zh_CN.utf8,并安装有zh_CN.utf8这个locale。如果shell和LANG配置不同,则中文显示乱码;如果LANG里设置的locale没有安装,则不能显示系统的中文提示信息,只会显示英文提示信息。

如果仅修改某用户的locale,只需要在其主目录下的bash配置文件中export对应的字符环境。如修改'.profile',在尾部加入:
export LC_ALL="zh_CN.gbk"

重新登录或新开终端即可修改当前的字符环境,如果想修改系统全局的locale,则需要修改全局配置文件(/etc/profile),方法如上。同样想修改全局的字符编码可以修改:/etc/default/locale这个文件中所定义的字符集,它由update-locale指令所生成。

修改'/etc/default/locale'中所默认指定的locale为期望值,并执行'locale -a'查看系统中是否有待指定的locale,若没有需要调用apt工具安装(apt-get install -y locales),有如下的查看或设定指令工具:
locale
locale -a
localectl
localectl list-locales
localedef --list-archive

或在'/etc/locale.gen'文件中去除相关的注释,再用'locale-gen'指令来生成待指定的locale,在'/usr/share/i18n/'目录下生成对应的locale目录;或直接使用命令:'locale-gen <locale>'。


vim显示中文

安装中文包后还要编辑vim的配置文件( /etc/vimrc),在最后加入以下内容:
set fileencoding=utf-8
set fileencodings=utf-8,gb18030,gbk,big5


参考链接:https://wiki.debian.org/Locale

该文章最后由 阿炯 于 2022-10-22 06:48:05 更新,目前是第 2 版。