linux中文乱码问题及locale详解

时间:2023-03-09 00:49:44
linux中文乱码问题及locale详解

一、修改系统默认语言及中文乱码问题
记录系统默认使用语言的文件是/etc/sysconfig/i18n,如果默认安装的是中文的系统,i18n的内容如下:

LANG="zh_CN.UTF-8"
SYSFONT="latarcyrheb-sun16"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh" LINUXTYPE=targeted

LANG变量是language的简称,决定系统的默认语言的,即系统的菜单、程序的工具栏语言、输入法默认语言等。SYSFONT是system font的简称,决定系统默认用哪一种字体。SUPPORTED变量决

定系统支持的语言,即系统能够显示的语言。需要说明的是,由于计算机起源于英语国家,因此,不管你把这些变量设置成什么,英语总是默认支持的,而且不管用什么字体,英文字体总包含在其中。

临时调整终端乱码现象:# LANG="en_US.UTF-8"

即把系统的语言临时设置成英文,或者更简单一点,可以直接这样:
# LANG="" 或export LANG=""

LANG变量被清空后,系统就默认用英语。这样设置后,在字符模式下输出的出错信息等就是全英文的了。但这种设置是临时的,只是临时改变了LANG这个bash变量而已。当退出重新登录或者切换到其他字符终端后就无效了。只要把i18n文件中的LANG变量设置成英文的”en_US.UTF-8”,就可以永久解决这个问题了。命令:vi etc/sysconfig/i18n
修改后的文件如下: #LANG="zh_CN.UTF-8" LANG="en_US.UTF-8" SYSFONT="latarcyrheb-sun16" SUPPORTED="zh_CN.UTF-8:zh_CN:zh" 
请不要把LANG变量简单的清空,因为这个变量不仅在字符模式下用到,在图形界面下也用到,简单清空在字符模式下确实不会有问题,但在图形界面下,却会造成中文无法正常显示的情况,在过去Redhat系列的版本中i18n文件中还有一个叫LANGUAGE的变量,专门控制图形界面下的语言设置,现在的FC系列中已经把这两个变量整合成一个变量了。 

二、locale

程序运行使用一套语言需要有字符集(数据)和字体(显示),Locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。
locale常用操作
1、查看现有语言环境:
locale
2、可用语言环境:
locale -a
3、临时修改语言环境:
AIX:
export LANG=en_US
export LANG=zh_CN

Linux:
export LANG=en_US.UTF-8
export LANG=zh_CN.UTF-8
4、永久修改系统级字符集:
修改/etc/sysconfig/i18n
英文版系统:
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"

中文版系统:
LANG="zh_CN.UTF-8"或者LANG="zh_CN.gbk"
SYSFONT="latarcyrheb-sun16"

vi /.bash_profile

三、安装中文字符集

1、安装所有与中文支持相关的包
# yum -y groupinstall chinese-support

2、修改字符编码配置文件
# vi /etc/sysconfig/i18n
修改后内容如下:
LANG="zh_CN.UTF-8"
SUPPORTED="zh_CN:zh:en_US.UTF-8:en_US:en:zh_CN.GB18030"
SYSFONT="latarcyrheb-sun16"

locale详解
在 Linux 中通过 locale 来设置程序运行的不同语言环境,locale 由 ANSI C 提供支持。locale 的命名规则为:
<语言>_<地区>.<字符集编码>
如:
zh_CN.UTF-8,zh代表中文,CN代表大陆地区,UTF-8表示字符集。
在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:
# locale
LANG="POSIX"
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
设置后,使用zh_CN.GBK中文locale:

# export LC_ALL=zh_CN.GBK
# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.GBK"
LC_NUMERIC="zh_CN.GBK"
LC_TIME="zh_CN.GBK"
LC_COLLATE="zh_CN.GBK"
LC_MONETARY="zh_CN.GBK"
LC_MESSAGES="zh_CN.GBK"
LC_PAPER="zh_CN.GBK"
LC_NAME="zh_CN.GBK"
LC_ADDRESS="zh_CN.GBK"
LC_TELEPHONE="zh_CN.GBK"
LC_MEASUREMENT="zh_CN.GBK"
LC_IDENTIFICATION="zh_CN.GBK"
LC_ALL=zh_CN.GBK
"C"是系统默认的locale,"POSIX"是"C"的别名。所以当我们新安装完一个系统时,默认的locale就是C或POSIX。

LANG="zh_CN.UTF-8" 
SYSFONT="latarcyrheb-sun16"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
LINUXTYPE=targeted
LANG="zh_CN.GB18030"
LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
SUPPORTED="zh_CN.GB18030:zh_CN:zh:en_US.UTF-8:en_US:en"
SYSFONT="lat0-sun16"