less/more/grep/vim 正常顯示中文。screen 會話後,無論終端還是 vim,中文均亂碼。screen 是「終端中的終端」,它有自己的編碼環境。外部終端 (xshell/gnome-terminal) 能將自身編碼傳遞給系統 (通過 LANG/LC_CTYPE),系統據此對輸出做轉碼。但 screen 內部編碼默認為 UTF-8,不自動繼承外部終端編碼,導致 GBK 文件在 screen 中直接按 UTF-8 解碼 → 亂碼。
編輯 ~/.screenrc,添加:
defencoding GBK
encoding UTF-8 GBK
defencoding GBK:新建窗口默認使用 GBK 編碼。encoding UTF-8 GBK:當前終端編碼為 UTF-8,輸入/輸出轉換為 GBK (即 screen 內部按 GBK 處理,與外部 UTF-8 終端互轉)。screen -S test
# 在 screen 內
cat gbk_file.txt # 應正常顯示
vim gbk_file.txt # 應正常編輯
locale # 查看 LANG/LC_CTYPE
若需同時處理 UTF-8 與 GBK 文件,可在 screen 內臨時切換:
# 進入 screen 後
:encoding UTF-8 UTF-8 # 切換到 UTF-8 模式
:encoding UTF-8 GBK # 切回 GBK 模式
iconv -f GBK -t UTF-8 file.txt > file_utf8.txt。screen -U (UTF-8 模式) 或腳本自動寫入 .screenrc。screen 亂碼本質是「終端編碼與 screen 內部編碼不匹配」。通過 defencoding/encoding 顯式聲明轉換規則,即可完美解決 GBK/UTF-8 混用場景下的顯示問題。