Wie kann ich die Textdatei cp1251 in der UTF-8-Konsole anzeigen?

7

Versuch 1:

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

Versuch 2:

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

Problemumgehung:

$ iconv -f cp1251 < subs.srt | less

Wie mache ich das bequem?

Vi.
quelle
1
Was meinst du mit "bequem"?
Strg-Alt-Delor
Mit "bequem" meine ich: 1. Vermeiden Sie die Eingabe langer Befehlszeilen; 2. Vermeiden Sie es, die gesamte Datei im Speicher zu halten. 3. Akzeptieren Sie lessdie Optionen in der Befehlszeile regelmäßig.
Vi.

Antworten:

7

lessVerwenden Sie luit (im Lieferumfang der X11-Dienstprogramm-Suite enthalten) , um eine andere Codierung als die des Terminals auszuführen .

LANG=ru_RU.CP1251 luit less subs.srt

Wenn Sie die Codierung automatisch erkennen möchten, ist dies schwieriger, da eine Textdatei keinen Hinweis auf ihre Codierung enthält. Die Software Enca versucht, die Codierung einer Datei anhand ihrer Sprache zu erkennen:

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

Sie können diese Kombination zu einem LESSOPENFilter machen (siehe Wie kann ich komprimierte Dateien in weniger anzeigen, ohne zless eingeben zu müssen? ). Dies führt möglicherweise nicht zu guten Ergebnissen für Text, der jedoch nicht auf Russisch ist.

Wenn Sie nur UTF-8 und CP1251 verwenden, können Sie auf CP1251 zurückgreifen, wenn eine Datei nicht gültig ist. UTF-8 enthält „ Lücken “ in UTF-8, die dazu führen, dass die meisten Dateien in einer 8-Bit-Codierung nicht gültig sind UTF-8. Proof-of-Concept-Filterskript für LESSOPEN(funktioniert möglicherweise nicht auf anderen Systemen als Linux, da head -c Ngenau N Bytes gelesen werden müssen):

#!/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
Gilles 'SO - hör auf böse zu sein'
quelle