Попытка 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
фильтром (см.Как просмотреть сжатые файлы в less, не вводя zless?(например). Однако это может не дать хороших результатов для текста, который на самом деле не на русском языке.
Если вы используете только UTF-8 и CP1251, вы можете вернуться к CP1251, когда файлне является допустимым UTF-8— в UTF-8 есть «дыры», из-за которых большинство файлов в 8-битной кодировке не являются допустимыми UTF-8. Скрипт фильтра для проверки концепции LESSOPEN
(может не работать на системах, отличных от Linux, поскольку он полагается на head -c N
чтение ровно 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