| 變數 | 作用 | 優先級 |
LANG | 預設語系 (語言_地區.編碼) | 低 |
LC_CTYPE | 字元分類與轉換 (編碼核心) | 中 |
LC_MESSAGES | 系統提示訊息語言 | 中 |
LC_ALL | 強制覆蓋所有 LC_* 變數 | 最高 |
LANGUAGE | 訊息語言備選列表 (冒號分隔) | 僅影響 gettext |
關鍵規則: LC_ALL > LC_* > LANG。設定 LC_ALL 會忽略所有單項設定。
查看當前 Locale
locale
# 輸出範例:
# LANG=en_US.UTF-8
# LC_CTYPE="en_US.UTF-8"
# LC_NUMERIC="en_US.UTF-8"
# ...
# LC_ALL=
locale -a # 列出系統支援的所有 locale
locale -m # 列出支援的字元映射 (編碼)
修改方法
1. 臨時修改 (當前 Shell 生效)
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
# 立即生效,關閉終端失效
2. 永久修改 - 系統級 (所有使用者)
RHEL/CentOS/Fedora (systemd):
# 方法一:localectl (推薦)
localectl set-locale LANG=zh_CN.UTF-8
# 方法二:編輯配置檔
vim /etc/locale.conf
# 內容:
LANG=zh_CN.UTF-8
# LC_CTYPE=zh_CN.UTF-8 # 如需單獨設定
Ubuntu/Debian:
# 方法一:update-locale (推薦)
sudo update-locale LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8
# 方法二:編輯
vim /etc/default/locale
# 內容:
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8
3. 永久修改 - 使用者級
vim ~/.bashrc
# 末尾加入:
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
source ~/.bashrc
4. 生成 Locale (若目標 locale 未安裝)
# RHEL/CentOS
localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8
# 或
dnf install langpacks-zh_CN
# Ubuntu/Debian
locale-gen zh_CN.UTF-8
dpkg-reconfigure locales # 互動式選擇
經典問題場景與解決
場景一:Java/資料庫導出中文變 null
現象: 條件含中文查詢,導出 Excel 顯示 null。
原因: JVM 預設編碼為 file.encoding (受 LANG/LC_CTYPE 影響),非 UTF-8 導致中文解析失敗。
解決:
- 系統級設定
LANG=zh_CN.UTF-8 (如上)
- JVM 啟動參數強制:
-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
- 資料庫連線字串指定編碼:MySQL
?characterEncoding=utf8、PostgreSQL client_encoding=utf8
場景二:終端顯示中文亂碼/方塊字
檢查: 終端模擬器編碼設定 (Putty/Xshell/Terminal.app → UTF-8) + 系統 LC_CTYPE。
解決: 確保兩端一致為 UTF-8。
場景三:檔案名編碼不一致 (Samba/NFS/FTP)
現象: Windows 建立中文檔名,Linux 掛載顯示亂碼。
解決: 掛載選項指定 iocharset=utf8 (SMB/CIFS)、nls=utf8 (FAT/NTFS)。
場景四:Python 3 開啟檔案編碼警告
# 程式碼開頭宣告
# -*- coding: utf-8 -*-
# 或 Python 3.7+ 環境變數
export PYTHONUTF8=1
常見編碼對照表
| Locale 值 | 編碼 | 適用場景 |
zh_CN.UTF-8 | UTF-8 | 現代標準,全字元支援,推薦 |
zh_CN.GB18030 | GB18030 | 國標擴展,含生僻字,政府/舊系統 |
zh_CN.GB2312 | GB2312 | 舊國標,字元集較小,不推薦新專案 |
zh_CN.GBK | GBK | 微軟擴展 GB2312,Windows 相容 |
en_US.UTF-8 | UTF-8 | 英文環境,國際化預設 |
驗證修改生效
# 重新登入或重啟後
locale | grep -E 'LANG|LC_CTYPE|LC_ALL'
# 測試中文顯示
echo "測試中文"
date # 應顯示中文日期格式
# 測試 Python 編碼
python3 -c "import sys; print(sys.getdefaultencoding())" # 應為 utf-8
統一系統 Locale 為 zh_CN.UTF-8 並確保應用層編碼一致,可徹底解決 90% 以上的中文編碼問題。