Como posso visualizar o arquivo de texto cp1251 no console UTF-8?

Como posso visualizar o arquivo de texto cp1251 no console UTF-8?

Tentativa 1:

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

Tentativa 2:

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

Gambiarra:

$ iconv -f cp1251 < subs.srt | less

Como faço isso de forma conveniente?

Responder1

Para lessexecutar em uma codificação diferente da do terminal, useluit(que acompanha o conjunto de utilitários X11).

LANG=ru_RU.CP1251 luit less subs.srt

Se você deseja detectar a codificação automaticamente, isso é mais complicado, porque um arquivo de texto não traz nenhuma indicação de sua codificação. O softwareEncatenta reconhecer a codificação de um arquivo com base em seu idioma:

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

Você pode transformar esta combinação em um LESSOPENfiltro (vejaComo posso visualizar arquivos compactados em menos sem precisar digitar zless?Por exemplo). No entanto, isso pode não dar bons resultados para textos que não estejam em russo.

Se você usar apenas UTF-8 e CP1251, poderá voltar para CP1251 quando um arquivonão é válido UTF-8- existem “buracos” no UTF-8 que fazem com que a maioria dos arquivos em uma codificação de 8 bits não sejam UTF-8 válidos. Script de filtro de prova de conceito para LESSOPEN(pode não funcionar em sistemas diferentes do Linux, porque depende da head -c Nleitura de exatamente N bytes):

#!/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

informação relacionada