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

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

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?

Antwort1

Um lesseine andere Kodierung als die des Terminals auszuführen, verwenden Sieluit(das im Lieferumfang der X11-Dienstprogrammsuite enthalten ist).

LANG=ru_RU.CP1251 luit less subs.srt

Wenn Sie die Kodierung automatisch erkennen möchten, ist das schwieriger, da eine Textdatei keinen Hinweis auf ihre Kodierung enthält. Die SoftwareEncaversucht, die Kodierung 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 als LESSOPENFilter verwenden (sieheWie kann ich gzippte Dateien in Less anzeigen, ohne zless eingeben zu müssen?für ein Beispiel). Das führt jedoch möglicherweise nicht zu guten Ergebnissen bei Texten, die nicht tatsächlich auf Russisch sind.

Wenn Sie nur UTF-8 und CP1251 verwenden, können Sie auf CP1251 zurückgreifen, wenn eine Dateiist kein gültiges UTF-8— es gibt „Lücken“ in UTF-8, die dazu führen, dass die meisten Dateien in einer 8-Bit-Kodierung kein gültiges UTF-8 sind. Proof-of-Concept-Filterskript für (funktioniert möglicherweise nicht auf anderen Systemen als Linux, da es auf dem Lesen von genau N Bytes LESSOPENberuht ):head -c 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

verwandte Informationen