$LANGが端末に与える影響

$LANGが端末に与える影響

頑張る勉強するgnome-terminal $LANG(および対応する文字エンコーディングのデフォルト設定)で変数がどのように機能するか。私はデフォルトの文字セットとしてiso8859-1(latin1)を使用しており、すべてのファイル名はこの方法でエンコードされています。

ls -l次のテストでは、ファイル名にスペイン語のアクセント文字を含むディレクトリを作成します。

ケース1:

  • ISO-8859-1で構成されたgnome端子
  • LANG「en_US-iso8859-1」に設定
  • 結果:すべてのファイルが正しく表示されます。

ケース#2:

  • gnome 端末は UTF-8 で構成されます。
  • LANG「en_US-iso8859-1」に設定
  • 結果:私が見るすべてのスペイン語の文字はゴミ文字です。これは、端末の文字エンコーディングを変更したために予想される現象です。

ケース#3:

  • ISO-8859-1で構成されたgnome端子
  • LANG「en_US-UTF-8」に設定
  • 結果:私が見るすべてのスペイン語の文字はゴミ文字です。

最後のケースで間違った文字が表示されるのはなぜですか?出力してはいけないエルエスファイル名をgnome-terminalに直接送信しますか? gnome-terminalはISO-8859-1に合わせて設定されているので、正しく見えるようにしてください。

しばらくの間、私はbashが私の$LANG変数を考慮していくつかの変換をしているかもしれないと思いました。その後、端末をUTF-8に切り替えましたが、まだ正しい文字が表示されません。私はlsの出力をxxdにパイプしていましたが、驚くべきことに、ISO-8859-1というファイルがそのままエンコードされていることがわかりました。

要約:私のリストにISO-8859-1文字が含まれていて、私の端末エミュレータが同じ文字エンコーディングで構成されている場合:それ以外の場合、LANG設定時に誰が変換を実行しますか?

あなたが提供できる助けに感謝します。

クラコニア

答え1

設定はLANG端末設定と一致する必要があります。より正確には、(文字エンコーディング)設定はLC_CTYPE端末のエンコーディングと一致する必要があり、他のロケールは一致する必要はありません。端末のエンコーディングは通常、ロケール変数ではなく端末エミュレータのオプションによって指定されます。これはLC_CTYPE2つのガイドラインを組み合わせます。つまり、端末(入力および出力)で使用するエンコーディングをアプリケーションに通知し、ファイルに使用するエンコーディングをアプリケーションに通知します。ケース 2 と 3 では、ls出力が端末とは異なるエンコーディングで表示されることを指定したため、出力が歪んでいました。

UTF-8 と latin-1 エンコーディングを異なる時間に使用する場合は、UTF-8 を使用するように端末を設定します。これにより、LC_CTYPEUTF-8を表す値が設定されます。この設定を上書きしないでください。 (ターミナルエミュレータがそれを設定していない場合は、LC_CTYPEシェル起動ファイルまたはセッション全体で置き換えます。)UTF-8端末でlatin-1データを使用するには、次のようにします。luit(Xユーティリティスイートに含まれています)

LC_CTYPE=en_US.iso88591 luit

(たとえば、同じエンコーディングを使用する別のロケールを使用できますLC_CTYPE=es_ES.iso88591 luit。)

答え2

ケース#2と#3では、UTF-8とLatin-1という2つの異なるエンコーディングを混合します。 #1の場合、両方にLatin-1を使用するので問題はありません。

このlsコマンド(およびよく実行されている他のすべてのプログラム)は、LANG設定を使用してコーディング

2つの異なる言語を混在させることができますが、2つの異なるエンコーディングを混在させないでください。

LC_*環境変数もLANG変数と同じエンコードを使用していることを確認してください。

経験的には、UTF-8のみを使用するようにシステムを設定する必要があります。

古いデータファイル(Javaプロパティなど)を編集する必要がある場合は、特別なエディタ(Java IDEなど)またはiconv「recode..」などのツールを使用してエンコードを確認する必要があります。

答え3

必要以上に多いかもしれませんが…

RHEL5 以前では、予期しない理由により、多くのマニュアルページが asciiized されていることがわかりました。つまり、元のマニュアルページがデフォルトの文字セットから7ビットASCIIに変換されました。 LCとLANGで何をしても、マニュアルページは事実上latin1役に立たないマニュアルページを生成します。すべての特殊(8ビット)文字は7ビットプレースホルダ(通常)に置き換えられました??。これは面白いと思います。

ただし、utf8これらのマニュアルページのバージョンは言語固有のディレクトリにあります。秘訣は正確な名前を尋ねることです。たとえば、latin1は実際にですiso_8859-1。マンページを作成し、LANG設定が正しい場合、マンページは言語固有のサブディレクトリ(en/man7/iso_8859-1.7)にあります。しかし、何らかの理由で要求された場合は、iso-8859-1ASCIIバージョンが提供されます。

関連情報