Linux 伺服器安裝時若選擇中文語系,可能導致終端顯示亂碼、腳本執行報錯(如 warning: setlocale: LC_CTYPE: cannot change locale)、應用程式行為異常。將系統語系統一設為 en_US.UTF-8 是標準運維做法。
locale
# 輸出範例:
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
...
LC_ALL=
# 1. 安裝語言包(若未安裝)
apt-get update && apt-get install -y language-pack-en-base
# 2. 修改系統預設 locale
vi /etc/default/locale
# 內容:
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
LC_ALL="en_US.UTF-8"
# 3. 生成 locale
locale-gen en_US.UTF-8
update-locale LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8
# 4. 重新登入或重啟生效
reboot
# 1. 查看可用語系
localectl list-locales | grep en_US
# 2. 設定系統語系
localectl set-locale LANG=en_US.UTF-8
# 3. 或手動修改
vi /etc/locale.conf
# 內容:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
# 4. 重啟生效
reboot
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export LANGUAGE=en_US:en
可加入 ~/.bash_profile 或 /etc/profile.d/locale.sh 使登入自動生效。
原因:客戶端 SSH 設定發送本地語系(SendEnv LANG LC_*),但伺服器缺少對應 locale。
# 伺服器端安裝缺失的 locale
# Ubuntu:
locale-gen zh_CN.UTF-8
# CentOS:
yum install -y langpacks-zh_CN
# 或直接強制使用 en_US.UTF-8
export LC_ALL=en_US.UTF-8
編輯本機 /etc/ssh/ssh_config 或 ~/.ssh/config:
# 註解掉 SendEnv LANG LC_* 避免傳送本地語系
# SendEnv LANG LC_*
locale
# 應顯示:
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
...
LC_ALL=en_US.UTF-8
| 場景 | 影響 | 建議 |
|---|---|---|
| 資料庫(MySQL/PostgreSQL) | 排序規則、字元集 | 資料庫層面單獨設定 utf8mb4,系統語系不影響 |
| Java 應用 | JVM 預設 Charset | 啟動參數指定 -Dfile.encoding=UTF-8 |
| Python 腳本 | stdin/stdout 編碼 | 代碼中顯式指定 encoding |
| 日誌分析 | 中文日誌顯示 | 系統語系改為 en_US.UTF-8 反而避免亂碼 |
統一系統語系為 en_US.UTF-8 能避免絕大多數編碼衝突。修改後需重新登入或重啟服務生效。應用層面仍需在代碼/配置中顯式指定字元集,不依賴系統預設值。