Terminal

$LANG 對終端的影響

  • December 22, 2015

我正在嘗試了解$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。)

引用自:https://unix.stackexchange.com/questions/48689