首先要区别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 后刷新,命令如下:

echo "" > /etc/locale.conf
echo "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: 错误或警告

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐