$LANG 對終端的影響
我正在嘗試了解該
$LANG
變數在 gnome-terminal (及其字元編碼首選項)中的行為。我一直使用 iso8859-1 (latin1) 作為我的主要字元集,我所有的文件名都是這樣編碼的。對於以下測試,我將
ls -l
在文件名中使用帶有西班牙重音字元的目錄:情況1:
- 為 ISO-8859-1 配置的 gnome-terminal
LANG
設置為“en_US-iso8859-1”- 結果:我正確地看到了所有文件
案例2:
- 為 UTF-8 配置的 gnome-terminal
LANG
設置為“en_US-iso8859-1”- 結果:我看到所有西班牙語字元的垃圾字元。這是預期的,因為我更改了終端的字元編碼
案例#3:
- 為 ISO-8859-1 配置的 gnome-terminal
LANG
設置為“en_US-UTF-8”- 結果:我看到所有西班牙語字元的垃圾字元。
為什麼在最後一種情況下我看到亂碼?ls的輸出不應該將文件名直接發送到 gnome-terminal 嗎?而且由於 gnome-terminal 是為 ISO-8859-1 配置的,我希望它們看起來正確。
有那麼一刻我想,也許 bash 正在考慮我的
$LANG
變數並執行一些轉換。然後我將終端切換到 UTF-8,但我仍然看不到正確的字元。我什至將 ls 的輸出通過管道傳輸到 xxd,令我驚訝的是,我仍然看到按原樣編碼的文件:ISO-8859-1。總結一下:如果我的列表包含 ISO-8859-1 字元,並且我的終端仿真器配置為相同的字元編碼:
LANG
否則誰在進行轉換?感謝您的任何幫助,您可以提供。
克拉科尼亞
您的設置
LANG
必須與終端匹配。更準確地說,您的LC_CTYPE
(字元編碼)設置必須與終端的編碼匹配,其他區域設置不需要匹配。終端的編碼通常由終端仿真器的一個選項指定,而不是由語言環境變數指定。它LC_CTYPE
結合了兩個指示:它告訴應用程序在終端上使用什麼編碼(用於輸入和輸出),它告訴應用程序對文件使用什麼編碼。在情況 2 和 3 中,您已告知ls
以與終端不同的編碼顯示輸出,因此輸出是亂碼。如果您在不同時間同時使用 UTF-8 和 latin-1 編碼,請將您的終端配置為使用 UTF-8。這應該會導致它設置
LC_CTYPE
為指示 UTF-8 的值;不要覆蓋此設置。(如果終端模擬器未設置LC_CTYPE
,請在您的 shell 啟動文件或整個會話中覆蓋它。)要在 UTF-8 終端中處理 latin-1 數據,請使用luit
(包含在 X 實用程序套件中)。LC_CTYPE=en_US.iso88591 luit
(您可以使用具有相同編碼的任何其他語言環境,例如
LC_CTYPE=es_ES.iso88591 luit
。)