Linux 終端亂碼是開發者、運維人員的常見痛點。本文系統分類亂碼成因,提供針對性診斷與修復方案,並給出生產環境緊急恢復的標準化操作流程,助你從「始亂終棄」轉為「始亂終治」。
| 類型 | 典型現象 | 核心成因 | 診斷命令 |
|---|---|---|---|
| 中文顯示亂碼 | 中文顯示為方框、亂碼、問號 | Locale 未設定、終端不支援 CJK、字體缺失 | locale, echo $LANG |
| Oracle/安裝器介面亂碼 | 圖形安裝介面字元錯位 | 安裝器依賴 Locale 自動選擇字符集,中文 Locale 觸發 Bug | env | grep LANG |
| 二進制檔案污染 | cat 後提示符變形、鍵盤輸入異常 | 控制字元 (ESC 序列) 重置終端狀態、切換字符集 | file suspicious.bin |
| SSH 偽終端異常 | 本地正常、遠程 SSH 亂碼 | SSH 客戶端/服務端編碼協商失敗、終端類型不匹配 | echo $TERM, locale -a |
# 臨時生效 (當前 Shell)
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
# 永久生效 (用戶級)
echo 'export LANG=zh_CN.UTF-8' >> ~/.bashrc
echo 'export LC_ALL=zh_CN.UTF-8' >> ~/.bashrc
source ~/.bashrc
# 永久生效 (系統級, 需 root)
# /etc/locale.conf
LANG=zh_CN.UTF-8
LC_ALL=zh_CN.UTF-8
# 檢查可用 Locale
locale -a | grep -i zh
# 安裝中文 Locale (Debian/Ubuntu)
apt-get install locales
dpkg-reconfigure locales # 選擇 zh_CN.UTF-8
# 安裝中文 Locale (CentOS/RHEL)
yum install langpacks-zh_CN
localectl set-locale LANG=zh_CN.UTF-8
# zhcon (帧緩衝區中文終端,經典方案)
apt-get install zhcon
# 或 yum install zhcon
# 執行: zhcon --utf8 --drv=vga
# fcitx / ibus (輸入法框架,含終端支援)
apt-get install fcitx fcitx-googlepinyin
# 現代方案: 使用支援 Unicode 的終端模擟器
# Windows: Windows Terminal, MobaXterm, Tabby
# Mac: iTerm2, Tabby
# Linux: GNOME Terminal, Konsole, Alacritty, Kitty, WezTerm
# 啟動安裝器前設定
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
./runInstaller
# 或單次執行
LANG=en_US.UTF-8 ./runInstaller
注意:Oracle 10.2+ 版本已大幅改善中文安裝支援,優先嘗試原生中文環境。
# 現象: cat 了 .pyc, .so, .bin, core dump 等二進制檔
# 提示符變形、鍵盤輸入顯示亂碼、螢幕控制序列失效
# 方案 1: reset 命令 (最標準、完整重置)
reset
# 等效於: tput reset; 包含清屏、重置終端屬性、重繪提示符
# 方案 2: tput sgr0 (僅重置屬性,不清屏,速度快)
tput sgr0
# sgr0 = Select Graphic Rendition 0 (正常模式)
# 方案 3: stty sane (重置終端列隊屬性)
stty sane
# 方案 4: 盲打恢復 (極端情況下連提示符都不可見)
# Ctrl+L (清屏) → 輸入 reset → Enter
# 或: Ctrl+V, Ctrl+N (發送 SO - Shift Out, 切換回 G0 字符集)
# 或: echo -e '\017' (八進制 017 = SI, Shift In)
# 客戶端配置 (~/.ssh/config)
Host myserver
HostName 192.168.1.100
User admin
# 強制 UTF-8 環境
SendEnv LANG LC_*
SetEnv LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8
# 服務端配置 (/etc/ssh/sshd_config)
AcceptEnv LANG LC_*
# 確保服務端安裝了對應 locale
# 終端類型匹配
# 本地: echo $TERM → xterm-256color
# 遠程: 確認 /etc/termcap 或 /usr/share/terminfo 有對應定義
# 不匹配時: export TERM=xterm-256color (或 xterm, vt100)
# 實戰測試: 本地正常、遠程亂碼
# 1. 本地檢查: locale
# 2. 遠程檢查: ssh user@host locale
# 3. 對比差異,補齊缺失 locale 或強制統一
# 終端支援多字符集 (G0, G1, G2, G3)
# ESC ( 0 → G0 指向標準 ASCII
# ESC ( B → G0 指向 ASCII (UK)
# ESC ) 0 → G1 指向繪圖字符集 (線條字符)
# ESC ) B → G1 指向 ASCII
# Shift Out (SO, 0x0E, Ctrl+N) → 切換到 G1
# Shift In (SI, 0x0F, Ctrl+O) → 切換回 G0
# 實驗驗證:
echo -e '\016' # SO (0x0E) - 進入繪圖字符集,顯示亂碼
echo -e '\017' # SI (0x0F) - 返回標準字符集,恢復正常
$ cat fibo.pyc
# 輸出包含: 0x0E (SO) 等控制字元
# 導致終端切換到繪圖字符集 G1
# 恢復:
$ tput sgr0
# 或
$ echo -e '\017' # 發送 SI
| 步驟 | 動作 | 預期結果 |
|---|---|---|
| 1 | 確認當前 Locale: locale | LANG=zh_CN.UTF-8 (或 en_US.UTF-8) |
| 2 | 確認終端模擟器編碼設定 | UTF-8 / Unicode (非 GBK/Big5) |
| 3 | 檢查檔案編碼: file -i filename | text/plain; charset=utf-8 |
| 4 | 若為 SSH: 對比本地/遠程 locale | 兩側一致 |
| 5 | 誤 cat 二進制檔 | 立即執行 reset 或 tput sgr0 |
| 6 | 持續亂碼 | 檢查字體安裝: fc-list :lang=zh |
| 7 | 圖形應用亂碼 | 啟動前 export LANG=en_US.UTF-8 |
LC_ALL 覆蓋所有細分類,僅在測試時使用,生產環境設定 LANG 即可file、head -c 100、hexdump -C 確認後再 cat/lessless 可安全瀏覽二進制檔 (顯示 <binary>)tmux/screen 統一終端類型與編碼,減少 SSH 協商問題\[ \] 包裹非打印字元export LANG=zh_CN.UTF-8 + 安裝中文 Locale/字體/終端export LANG=en_US.UTF-8 強制英文介面reset (完整) 或 tput sgr0 (輕量) + 理解 SO/SI 機制建立「編碼即基礎設施」意識,將 Locale、終端、字體、SSH 納入標準化部署清單,才能從根源消除亂碼困擾,專注於核心業務價值創造。