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!   (*^-^*)