![Como posso visualizar o arquivo de texto cp1251 no console UTF-8?](https://rvso.com/image/36032/Como%20posso%20visualizar%20o%20arquivo%20de%20texto%20cp1251%20no%20console%20UTF-8%3F.png)
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 less
executar 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 LESSOPEN
filtro (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 N
leitura 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