web-dev-qa-db-ja.com

more、cat、lessでサポートされる文字エンコーディング

fileに従って次のようにエンコードされたテキストファイルがあります。

ISO-8859テキスト、CRLF行ターミネーター付き

このファイルには、アクセント付きのフランス語のテキストが含まれています。私のシェルはアクセントを表示でき、コンソールモードのemacsはこれらのアクセントを正しく表示できます。

私の問題は、morecat、およびlessツールがこのファイルを正しく表示しないことです。これらのツールがこの文字エンコーディングセットをサポートしていないことを意味していると思います。これは本当ですか?これらのツールでサポートされている文字エンコーディングは何ですか?

19
Manuel Selva

シェルはおそらくUTF-8を使用しているため、アクセントなどを表示できます。問題のファイルは別のエンコーディングであるため、lessmorecatはそれを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を右クリックして、次のようにエンコードをアクティブにする必要がある場合があります。

enter image description here

gnome-terminalの場合:

enter image description here

他の(より良い)オプションは、ファイルのエンコーディングを変更することです。

$ 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!
18
terdon

ISO-8858文字エンコーディングは、Linuxシステムでは少し古くなっています。 Linuxシステム全体がUTF-8を使用している可能性があります。端末エミュレータとシェルを含みます。

しかしながら。 catgrepおよび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
5
BatchyX

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