Как просмотреть текстовый файл cp1251 в консоли UTF-8?

Как просмотреть текстовый файл cp1251 в консоли UTF-8?

Попытка 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

Связанный контент