首先要区别3个概 :编码集、字符集、字体 是完全不同的东西,我们要解决的是字符集问题。
当一个系统初始化完毕后,会生成一个 /usr/lib/locale/locale-archive 文件,这个是字符集二进制文件,是系统不同语言运行的核心,通过命令 locale -a 可以看到当前文件中支持的语言
locale 命令可以看到当前的字符集情况
由于网络上充斥着大量垃圾信息(缺乏理论说明的解决方案),这里需要详细解释一下。
这里的POSIX是系统自带的,也就是C语言,对于其他语言 (eg. zh_CN.UTF-8),可以通过如下命令生成到/usr/lib/locale/locale-archive文件中:
localedef -i zh_CN -f UTF-8 zh_CN.UTF-8
此处代表的含义是: 通过UTF-8编码格式,对zh_CN进行编码,生成zh_CN.UTF-8字符集,这里的zh_CN可以通过如下命令查看:
(可以看到有 ca_ES en_US等很多文件夹,所有命令中 zh_CN可以改成这里任意文件夹名)
到这里,通过locale -a |grep zh_CN 确认了我们系统支持了中文的能力
通过 fc -list确认我们支持当前系统支持的字体
没有则向fonts传输就好(yum安装就不说了,常规字体基本都没有问题)
对于系统已经支持中文的条件下,只需要选择对就行了
网络上有很多帖子建议修改 /etc/environment 、/etc/profile、~/.bash_profile 、甚至 rc.local等
这些东西都不建议去设置,centos7专门设置了 /etc/locale.conf文件
回到locale命令
执行该命令后,所有选项都是"POSIX"后,对 /etc/locale.conf 进行编辑,输入 LC_CTYPE=zh_CN.UTF-8 后刷新,命令如下:
"" > /etc/locale.conf
"LC_CTYPE=zh_CN.UTF-8"> /etc/locale.conf
source /etc/locale.conf
此时 中文乱码问题就解决了。那么为什么不去不更改其他选项呢?或者直接将LANG 改成zh_CN.UTF-8呢,这里要弄清每一个参数的含义:
参数 | 说明 |
LANG | 当其他参数没有指定的时候,就指定为该值 |
LC_CTYPE | 语言符号和分类(可以看到这正是我们需要修改的) |
LC_NUMERIC | 数字格式,一般不用更改 |
LC_TIME | 时间格式,直观影响就是date命令的输出 |
LC_COLLATE | 排序的习惯规则,一般也不用修改 |
LC_MONETARY | 货币单位,这个对于服务器来说,没有修改必要 |
LC_MESSAGES | 提示信息,如安装软件,出现提示之类,无关紧要,用命令行的人总会点英语 |
LC_NAME | 姓名书写方式 |
LC_ADDRESS | 地址书写方式 |
LC_TELEPHONE | 电话书写方式 |
LC_MEASUREMENT | 度量衡表达方式,不用关系,几磅几磅之类 |
LC_PAPER | 纸张大小 |
LC_IDENTIFICATION | 对locale自身包含信息的概述 |
LC_ALL | 覆盖其他参数的值 |
通常我们要做的就仅仅是改变LC_CTYPE就可以,如果是简单机器下这里的任意一项都可以很方便的修改,但是如果复杂第一点,则很容易出现 setlocale: 错误或警告