So konvertieren Sie eine unbekannte 8-Bit-Datei in utf8

7

Ich habe eine .srt-Datei, die als Kauderwelsch angezeigt wird, wenn ich sie in gEdit in Ubuntu öffne. Also möchte ich es in utf8 konvertieren, um es lesen zu können.

Wenn ich versuche herauszufinden, was die Codierung gibt:

file -i x.srt 
x.srt: text/plain; charset=unknown-8bit

Bei einem anderen Versuch fand ich:

find .  -type f -print | xargs file
./x.srt:   Non-ISO extended-ASCII text, with CRLF line terminators

Auch ich habe versucht, enca:

enca x.srt 
enca: Cannot determine (or understand) your language preferences.
Please use `-L language', or `-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run `enca --list languages' to get a list of supported languages.

und

enca -L Persian  x.srt 
enca: Cannot determine (or understand) your language preferences.
Please use `-L language', or `-L none' if your language is not supported
(only a few multibyte encodings can be recognized then).
Run `enca --list languages' to get a list of supported languages.

Ich frage mich also, wie ich die Codierung kennen und schließlich in ein verwendbares Format konvertieren kann.

Super Mario
quelle
Sie können den Quellcode von SubRip überprüfen, um das vorhandene Dateiformat zu bestimmen: sourceforge.net/projects/subrip
William Deans
Gibt es zu viele Sprachen in 'enca-list-Sprachen'? Vielleicht führt das Schreiben eines Bash-Skripts zum Schreiben aller Sprachen zu einer Datei und einer visuellen Überprüfung nach ... so etwas wie "für lang in $ (enca-list-Sprachen") ); do eca -L $ lang -; done> tmp.txt "
Asain Kujovic
@OmerMerdan enca --list enthält eine Liste von 12 slawischen Sprachen zusammen mit Chinesisch und other.
Supermario
3
In welcher Sprache sollen die Untertitel sein? Können Sie ein Beispiel (Ausgabe von head -n 20 x.srt | od -tx1) posten ?
Gilles 'SO - hör auf böse zu sein'
Für mich hat der Versuch, die richtige Codierung zu erraten, funktioniert, z. B.iconv -f iso-8859-1 -t utf-8 < file.txt > out.txt
BladeMight

Antworten:

4

Es gibt keine zuverlässige Möglichkeit, von einer unbekannten Codierung in eine bekannte zu konvertieren.

Wenn Sie in Ihrem Fall wissen, dass der Originaltext auf Farsi / Persisch ist, können Sie möglicherweise eine Reihe möglicher Codierungen identifizieren und diese durchlaufen, bis Sie die erwartete Ausgabe sehen.

Basierend auf schnellem Googeln gibt es keinen stabilen Standardkonverter für die alte Iran-System-Codierung , und die einzige beliebte Alternative ist die Windows-Codepage 1256 . Ich habe MacArabic hier hauptsächlich zur Veranschaulichung aufgenommen (obwohl es vielleicht sogar eine praktikable Alternative für Farsi wäre?)

for encoding in cp1256 macarabic; do
    if iconv -f "$encoding" -t utf-8 inputfile >outputfile."$encoding"; then
        echo "$encoding: possible"
    else
        echo "$encoding: skipped"
        rm outputfile."$encoding"
    fi
done

(Meine Version von iconvunterstützt MacArabic nicht wirklich, aber vielleicht haben Sie mehr Glück; oder Sie können ein anderes Konvertierungstool ausprobieren.)

Untersuchen Sie die resultierenden Ausgabedateien. sehen Sie, ob einer von ihnen Sinn macht.

Wenn Sie wissen, wie die Ausgabe aussehen soll, können Sie auch einzelne Zuordnungen für Bytes in der Datei nachschlagen. Wenn das erste Byte 0x94 ist und Sie wissen, dass es als ﭖ angezeigt werden sollte, haben Sie im Grunde festgestellt, dass die Codierung das Iran-System ist. Vielleicht noch ein paar Bytes nachschlagen, um diese Schlussfolgerung zu überprüfen. Die Wikipedia-Seite für diese Codierung enthält eine Tabelle aller Zeichen. Dies ist offensichtlich mühsam, langsam und fehleranfällig, insbesondere wenn viele Kandidatencodierungen zur Auswahl stehen.

Für einige Codierungen finden Sie eine Liste, z. B. unter https://tripleee.github.io/8bit/. Für andere müssen Sie sich möglicherweise nur die entsprechenden Wikipedia-Codierungstabellen ansehen.

Tripleee
quelle
2

Eine Datei in einer unbekannten 8-Bit-Codepage wird aus einem Grund als "unbekannt-8-Bit" bezeichnet: Es ist kein einfaches Problem ohne Ideen zur Sprache. Um nicht zu sagen, dass es unmöglich ist, aber um effizient zu arbeiten, musste ein solcher heuristischer Detektor ein großes Vokabular aller am häufigsten verwendeten Sprachen, eine große Liste von Codepages und einige Grammatikkenntnisse besitzen. Update: nie versucht enca; Möglicherweise handelt es sich um einen Wunderdecoder, der in dieser Richtung hergestellt wurde. Wenn die Datei beispielsweise einen meist ASCII-Quellcode mit nur einem oder zwei Wörtern aus Oktetten mit hoher Bitmenge darstellt, ist es selbst mit einem solch wundersamen heuristischen Algorithmus praktisch unmöglich, die Sprache und die Codierung zu erraten. Aus diesem Grund bestand das ursprüngliche HTTP / 1.1 stark auf der Deklaration eines Zeichensatzes im HTTP- Content-Type:Header für jeden text/* Medientyp.

Also die Lösung nach Punkten:

  1. Untersuchen / lernen / raten Sie, welche Sprache die Datei angeblich codiert. Hier ist eine menschliche Intelligenz entscheidend. Stellen Sie zumindest eine Liste weniger plausibler Hypothesen zusammen.
  2. Erstellen Sie eine Liste der von den Sprachen verwendeten Codierungen.
  3. Probieren Sie diese Codierungen aus: headfile |iconv -ftry (es wird angenommen, dass die Umgebungsvariable LANG entsprechend einer verwendeten TUI festgelegt ist) und prüfen Sie, ob das Ergebnis bis zum Erfolg lesbar ist.

Diese Lösung setzt natürlich voraus, dass der Text ordnungsgemäß codiert ist, jedoch auf einer unbekannten Codepage. Fälle, in denen der Text durch einen menschlichen Fehler oder aufgrund eines Softwarefehlers verstümmelt wurde, können auf diese Weise nicht gelöst werden.

Die Punkte 2. und 3. können automatisiert sein, und solche Tools existieren zwar, sind jedoch sprachspezifisch (dh ein heuristischer Decoder für Russisch funktioniert nicht für Japanisch und umgekehrt) oder müssen zumindest die Eingabe angeben Sprache (wie encaauch).

Mögliche Codierungen für die persische Sprache sind Windows-1256 (siehe diesen Thread ), ISO 8859-6 und die veraltete Iran-Systemcodierung . Seien Sie froh, dass Sie hier keine Liste mit mindestens sieben für Russisch verwendeten Codepages haben (KOI7, KOI8, CP866, Windows-1251, ISO 8859-5, MacCyrillic, MIK).

Incnis Mrsi
quelle
1

Vielleicht, um alle ~ 1000 Möglichkeiten von iconv visuell zu überprüfen, indem 20 erste Zeilen von jeder aufgelistet werden ... zusammengeführt mit all.txt Ergebnis.

#!/usr/bin/env bash
                      line=$(printf "=%.0s" {1..50})
for FMT in $(iconv -l); do    
                   echo "$line\nFormat $FMT:\n$line"
   iconv -f $FMT -t UTF8 < inputFile.srt | head -n20
done > all.txt

#gedit all.txt

... und finden Sie heraus, welches Format das richtige ist (wenn Sie Persisch erkennen können).

Asain Kujovic
quelle
Dies ist übertrieben - iconv -lführt zu einer großen Anzahl effektiv duplizierter Aliase sowie offensichtlich unwahrscheinlichen Kandidaten wie verschiedenen CJKV-Codierungen.
Tripleee