UTF-8 コンソールで cp1251 テキスト ファイルを表示するにはどうすればいいですか?

UTF-8 コンソールで cp1251 テキスト ファイルを表示するにはどうすればいいですか?

試行1:

$ less subs.srt
"subs.srt" may be a binary file.  See it anyway? 
<C8><F2><E0><EB><FC><FF><ED> ...

試行2:

$ LANG=ru_RU.CP1251 less subs.srt
����� �����, ��� ������.
��� ������� �������������! ...

回避策:

$ iconv -f cp1251 < subs.srt | less

どうすれば便利にできますか?

答え1

less端末とは異なるエンコーディングで実行するには、ルイト(X11 ユーティリティ スイートに同梱されています)。

LANG=ru_RU.CP1251 luit less subs.srt

自動的にエンコードを検出したい場合は、テキストファイルにはエンコードの指示がないため、より複雑になります。ソフトウェアエンカ言語に基づいてファイルのエンコーディングを認識しようとします。

$ enca -L russian subs.srt
MS-Windows code page 1251
$ iconv -f "$(enca -iL russian subs.srt)" | less

この組み合わせをLESSOPENフィルターにすることができます(zless と入力せずに less で gzip 圧縮されたファイルを表示するにはどうすればよいでしょうか?ただし、実際にはロシア語ではないテキストの場合は、適切な結果が得られない可能性があります。

UTF-8とCP1251のみを使用する場合は、ファイルが有効なUTF-8ではありません— UTF-8 には「穴」があり、8 ビット エンコーディングのほとんどのファイルは有効な UTF-8 ではありません。概念実証フィルター スクリプトLESSOPEN(正確に N バイトを読み取る必要があるため、Linux 以外のシステムでは動作しない可能性がありますhead -c N)。

#!/bin/sh
head=$(head -c 1000)
if printf '%s\n' "$head" | grep -qav '^.*$'; then
  { printf '%s\n' "$head"; cat; } | iconv -f CP1251
else
  { printf '%s\n' "$head"; cat; }
fi

関連情報