Linux 系统中文语言乱码,是很多小伙伴在开始接触 Linux 时经常遇到的问题,而且当我们将已在 Wndows 部署好的专案搬到 Linux 上执行时,Tomcat 的输出日志中文全为乱码(在 Windows 上正常),看著非常心塞,那么我们应该怎么解决呢?
系统中文乱码
Tomcat 输出日志中文乱码
系统环境
CentOS 7.0 64 位
jdk-8u11-linux-x64.
apache-tomcat-8.5.16
解决步骤:
1. 安装中文语言包
先检视系统是否有安装中文语言包
# locale -a (列出所有可用的公共语言环境的名称)
若发现以上几项,说明系统已安装中文语言包,无需再安装,那这几项代表什么意思呢?
{语言代号}_{国家代号}.{字符集}
zh 是中文的代号、 CN 是中国的代号、 gb18030,gb2312,utf8 是语言字符集
那么每一项可以通俗理解为 “你是说中文的,你在中国,语言字符集是 gb18030/gb2312/utf8”
如果没有发现以上几项,则手动安装中文语言包
# yum install kde-l10n-Chinese (大概 11M)
2. 修改 i18n 国际化和 locale.conf 本土化配置档案
在修改配置档案之前,我们先看看当前系统语言环境
# locale
(“en_US.UTF-8″按照上面的内容可以理解为 “你说英语,你在美国,语言字符集为 UTF-8”)
每项的意思分别为 :
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 自身包含资讯的概述
LC_ALL:优先顺序最高变数,若设定了此变数,所有 LC_* 和 LANG 变数会强制跟随它的值
我们看到虽然安装了中文语言包但本机的语言环境并不是中文,先修改 i18n 配置档案
# vim /etc/sysconfig/i18n
新增如下两行程式码
LANG=”zh_CN.UTF-8″
LC_ALL=”zh_CN.UTF-8”
# source /etc/sysconfig/i18n
再修改 locale.cnf 配置档案
# vim /etc/locale.conf
LANG=”zh_CN.UTF-8″
# source /etc/locale.conf
重启系统
# reboot
3. 设定终端连线编码
档案->开启->选中会话->右键->属性->终端(我用的终端连线工具是 Xshell,其它连线工具更改编码方式请自行百度)
将编码改为 UTF-8
重新连线,再检视当前系统语言环境
# locale
发现系统语言环境已经成功改为 “zh_CN.UTF-8”
再次尝试编辑中文
# vim 你是猪吗
# ls
SUCCESS!至此,系统中文乱码问题已解决。
4. 解决 Tomcat 输出日志乱码
既然系统中文乱码已经解决了,那么 Tomcat 输出日志中文乱码会不会也解决了呢?
我们现在看看 Tomcat 输出日志
进入 Tomcat 目录
# cd $CATALINA_HOME
# tail -f ./logs/catalina.out
很遗憾,Tomcat 日志中文还是乱码。
分析:既然系统已经不会出现中文乱码,证明系统语言环境是正常的,但是 Tomcat 日志还会出现中文乱码,说明是 Tomcat 内部的问题,网上查了一些资料,知道是 JVM(Java Virtual Machine)
java 虚拟机器所用的字符集与系统所用的字符集不一致造成的,知道原因,问题就好解决了,可以通过配置 JVM 的启动引数来达到修改 JVM 所使用字符集的目的。
# ls -l ./bin/
找到 daemon.sh 和 catalina.sh 分别加入以下程式码:
JAVA_OPTS=”$JAVA_OPTS -Djavax.servlet.request.encoding=UTF-8 -Dfile.encoding=UTF-8 -Duser.language=zh_CN -Dsun.jnu.encoding=UTF-8″
# vim ./bin/daemon.sh
# vim ./bin/catalina.sh
储存退出,重启 Tomcat
# ./bin/shutdown.sh
# ./bin/startup.sh
现在再检视输出日志
# tail -f ./logs/catalina.out
向站群服务器发一次请求
Tomcat 输出日志中文正常显示。
end! (*^-^*)