file
に従って次のようにエンコードされたテキストファイルがあります。
ISO-8859テキスト、CRLF行ターミネーター付き
このファイルには、アクセント付きのフランス語のテキストが含まれています。私のシェルはアクセントを表示でき、コンソールモードのemacs
はこれらのアクセントを正しく表示できます。
私の問題は、more
、cat
、およびless
ツールがこのファイルを正しく表示しないことです。これらのツールがこの文字エンコーディングセットをサポートしていないことを意味していると思います。これは本当ですか?これらのツールでサポートされている文字エンコーディングは何ですか?
シェルはおそらくUTF-8を使用しているため、アクセントなどを表示できます。問題のファイルは別のエンコーディングであるため、less
more
とcat
はそれをUTFとして読み取ろうとして失敗します。現在のエンコーディングを確認するには
echo $LANG
2つの選択肢があり、デフォルトのエンコーディングを変更するか、ファイルをUTF-8に変更できます。エンコーディングを変更するには、ターミナルを開いて次のように入力します
export LANG="fr_FR.ISO-8859"
例えば:
$ echo $LANG
en_US.UTF-8
$ cat foo.txt
J'ai mal � la t�te, c'est chiant!
$ export LANG="fr_FR.ISO-8859"
$ xterm <-- open a new terminal
$ cat foo.txt
J'ai mal à la tête, c'est chiant!
gnome-terminal
または同様のものを使用している場合、たとえばterminator
を右クリックして、次のようにエンコードをアクティブにする必要がある場合があります。
gnome-terminal
の場合:
他の(より良い)オプションは、ファイルのエンコーディングを変更することです。
$ cat foo.txt
J'ai mal � la t�te, c'est chiant!
$ iconv -f ISO-8859-1 -t UTF-8 foo.txt > bar.txt
$ cat bar.txt
J'ai mal à la tête, c'est chiant!
ISO-8858文字エンコーディングは、Linuxシステムでは少し古くなっています。 Linuxシステム全体がUTF-8を使用している可能性があります。端末エミュレータとシェルを含みます。
しかしながら。 cat
、grep
およびless
はエンコード変換を行わず、ISO-8859/latin1ファイルをUTF-8として扱いますが、UTF-8は機能しません。
Emacsがそれらを表示できる場合、それは使用されているエンコーディングを自動検出しようとし、明らかに成功したためです。 emacsにファイルをUTF-8として保存するように指示すると、cat
/grep
/で何でも使用できるようになります。
正確な文字エンコードがわかっている場合(ISO-8859はそれらのコレクションです。ISO-8859-1またはISO-8859-15以降の正確な文字エンコードを知っている必要があります)、コマンドラインからファイルを変換することもできます。 :
iconv --from-code ISO-8859-15 your_file -o your_file_as_utf8
Cat、More、およびLessは、ファイルを表示する仕事をしているだけです。エンコーディング間の変換は彼らの仕事の説明にはありません。 CRLFは通常の行末LFと同じように表示されるので、改行のエンコードは問題になりませんが、端末はおそらく最近の事実上の標準であるUTF-8エンコードされたテキストを期待しています。
Luit は、サポートされているエンコーディングとUTF-8の間で変換します。 LC_CTYPE
環境変数を設定するか、-encoding
オプションを使用して、変換するエンコーディングをLuitに指示します。たとえば、latin-1(別名ISO 8859-1)ファイルを表示するには:
LC_CTYPE=en_US luit less somefile
luit -encoding ISO8859-1 less somefile
ファイルがLuitでサポートされていないエキゾチックなエンコーディングである場合は、トランスレータープログラムを介してパイプすることができます。 Iconv は多くのエンコーディングをサポートしています。
iconv -f latin1 somefile
iconv -f latin1 somefile | less