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を入力せずにgzip圧縮ファイルをlessとして表示するには?例えば)。しかし、これは実際にロシア語で書かれていないテキストには良い結果が得られないかもしれません。

UTF-8とCP1251のみを使用している場合は、ファイルを転送するときにCP1251に置き換えることができます。有効なUTF-8ではありません。- UTF-8には、ほとんどの8ビットエンコーディングファイルが有効なUTF-8にならないようにする「穴」があります。概念証明フィルタスクリプト(正確にNバイトを読み取るLESSOPEN必要があるため、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

関連情報