¿Cómo veo el archivo de texto cp1251 en la consola UTF-8?

¿Cómo veo el archivo de texto cp1251 en la consola UTF-8?

Intento 1:

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

Intento 2:

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

Solución alterna:

$ iconv -f cp1251 < subs.srt | less

¿Cómo lo hago cómodamente?

Respuesta1

Para lessejecutar en una codificación diferente a la del terminal, utiliceluit(que se envía con la suite de utilidades X11).

LANG=ru_RU.CP1251 luit less subs.srt

Si desea detectar la codificación automáticamente, es más complicado, porque un archivo de texto no contiene ninguna indicación de su codificación. El softwareEncáintenta reconocer la codificación de un archivo según su idioma:

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

Puedes hacer de esta combinación un LESSOPENfiltro (ver¿Cómo puedo ver archivos comprimidos con gzip en menos sin tener que escribir zless?para un ejemplo). Sin embargo, es posible que esto no dé buenos resultados para textos que no estén en ruso.

Si solo usa UTF-8 y CP1251, puede recurrir a CP1251 cuando un archivoUTF-8 no es válido- hay "agujeros" en UTF-8 que hacen que la mayoría de los archivos con codificación de 8 bits no sean UTF-8 válidos. Script de filtro de prueba de concepto para LESSOPEN(es posible que no funcione en sistemas distintos de Linux, porque depende de head -c Nla lectura exacta de 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

información relacionada