試行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