Codierung von Textdateien konvertieren

15

Ich stoße häufig auf Textdateien (z. B. Untertiteldateien in meiner Muttersprache, Persisch ) mit Problemen bei der Zeichenkodierung. Diese Dateien werden unter Windows erstellt und mit einer ungeeigneten Codierung (scheinbar ANSI) gespeichert, die wie folgt aussieht:

Bildbeschreibung hier eingeben

In Windows kann dies einfach mit Notepad ++ behoben werden , um die Codierung in UTF-8 zu konvertieren, wie unten dargestellt:

Bildbeschreibung hier eingeben

Und das korrekte lesbare Ergebnis sieht so aus:

Bildbeschreibung hier eingeben

Ich habe eine Menge für eine ähnliche Lösung auf GNU / Linux gesucht, aber leider sind die vorgeschlagenen Lösungen (zB diese Frage ) nicht funktionieren. Vor allem habe ich gesehen , wie Menschen vorschlagen iconvund , recodeaber ich habe kein Glück mit diesen Werkzeugen hat. Ich habe viele Befehle getestet, einschließlich der folgenden, und alle sind fehlgeschlagen:

$ recode ISO-8859-15..UTF8 file.txt
$ iconv -f ISO8859-15 -t UTF-8 file.txt > out.txt
$ iconv -f WINDOWS-1252 -t UTF-8 file.txt > out.txt 

Nichts davon hat funktioniert!

Ich verwende Ubuntu-14.04 und suche nach einer einfachen Lösung (entweder GUI oder CLI), die genauso funktioniert wie Notepad ++.

Ein wichtiger Aspekt ist „einfach“ ist , dass der Benutzer nicht die Quellencodierung zu bestimmen , die erforderlich; Vielmehr sollte die Quellcodierung vom Tool automatisch erkannt und nur die Zielcodierung vom Benutzer bereitgestellt werden. Trotzdem würde ich mich auch über eine funktionierende Lösung freuen, für die die Quellcodierung bereitgestellt werden muss.

Wenn jemand einen Testfall benötigt, um verschiedene Lösungen zu untersuchen, ist das obige Beispiel über diesen Link zugänglich .

Seyed Mohammad
quelle
2
Versuchen: vim '+set fileencoding=utf-8' '+wq' file.txt.
Muru
Farsi soll iso-639aber das scheint nicht in entweder vorhanden zu sein iconvoder recode. Zumindest sehe ich es nicht in der Ausgabe von iconv -l.
Terdon
@muru Ich habe deinen Vorschlag mit getestet, vimaber es hat nicht funktioniert.
Seyed Mohammad
@SeyedMohammad sah immer noch gleich aus?
Muru
@muru Yup! Keine Änderung.
Seyed Mohammad

Antworten:

12

Diese Windows-Dateien mit persischem Text sind in Windows-1256 codiert . So kann es per Befehl ähnlich wie bei OP versucht, aber mit unterschiedlichen Zeichensätzen entschlüsselt werden. Nämlich:

recode Windows-1256..UTF-8 <Windows_file.txt > UTF8_file.txt
(Denunziert auf Beschwerden des ursprünglichen Posters; siehe Kommentare)

iconv -f Windows-1256 Windows_file.txt > UTF8_file.txt

In diesem Beispiel wird davon ausgegangen, dass die Umgebungsvariable LANG auf ein UTF-8-Gebietsschema festgelegt ist. Um in eine beliebige Codierung (UTF-8 oder eine andere) zu konvertieren, kann man unabhängig vom aktuellen Gebietsschema Folgendes sagen:

iconv -f Windows-1256 Windows_file.txt -t ${output_encoding} > ${output_file}

Das Originalplakat wird auch mit der Semantik der Textrekodierungswerkzeuge (recode, iconv) verwechselt. Für die Quellcodierung ( source.. oder -f) muss angegeben werden, mit welcher Codierung die Datei gespeichert wird (von dem Programm, das sie erstellt hat). Nicht einige (naive) Vermutungen, die auf Mojibake-Zeichen in Programmen basieren, die versuchen, sie zu lesen (aber nicht). Die Suche nach einem persischen Text nach ISO-8859-15 oder WINDOWS-1252 war offensichtlich eine Sackgasse: Diese Kodierungen enthalten lediglich keinen persischen Buchstaben.

Incnis Mrsi
quelle
@Seyed Mohammad: jetzt mit explizit angegebenen Befehlen.
Incnis Mrsi
Vielen Dank! Der zweite Befehl (der mit iconv) funktionierte. Aber die erste (mit recode) funktionierte nicht richtig und die Ausgabe war immer noch Kauderwelsch. Bearbeiten Sie Ihre Antwort so, dass sie nur den iconvBefehl enthält, und ich markiere sie als Antwort.
Seyed Mohammad
1
Um von der LANG-Variableneinstellung frei zu sein, kann man Folgendes tun: Was iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txtich getestet und gearbeitet habe. Daher ist es möglicherweise eine gute Idee, Ihren Befehl so zu bearbeiten.
Seyed Mohammad
Ich habe ein nützliches Skript geschrieben, das auf dem Arbeitsbefehl basiert, den ich in einer anderen Antwort hier erklärt habe. Ich hoffe, es hilft anderen persischen Linux-Anwendern, da es mir sehr hilft.
Seyed Mohammad
@karel: Danke, "sich beschweren" ist ein Verb - die Phrase wurde ungrammatisch geschrieben.
Incnis Mrsi
1

Abgesehen davon iconv, dass dies ein sehr nützliches Tool für sich oder in einem Skript ist, gibt es eine wirklich einfache Lösung, die ich gefunden habe, um das gleiche Problem für griechische Zeichensätze (Windows-1253 + ISO-8859-7) herauszufinden.

Alles, was Sie tun müssen, ist, die Textdatei über das Dialogfeld "Öffnen" von Gedit und nicht durch Doppelklicken darauf zu öffnen . Am unteren Rand des Dialogfelds befindet sich ein Dropdown-Menü für die Codierung, das auf "Automatisch erkannt" eingestellt ist . Ändern Sie es in "Windows-125x" oder einen anderen geeigneten Codesatz und der Text ist in Gedit perfekt lesbar. Sie können es dann mit UTF-8-Codierung speichern, um sicherzugehen, dass Sie in Zukunft nicht mehr dasselbe Problem haben werden ...

Giorgos_tph
quelle
1

Als ergänzende Lösung für das Problem habe ich ein nützliches Bash-Skript vorbereitet, das auf dem iconvBefehl von Incnis Mrsis Antwort basiert :

#!/bin/bash

if [ $# -lt 1 ]
then
   echo 'Specify at least one file to fix.'
   exit 1
fi

# Temp file to store conversion attempt(s).
tmp='tmp.fixed'

for file in "$@"
do
  # Try to fix the file encoding.
  if iconv -f WINDOWS-1256 "$file" -t UTF-8 > $tmp; then
    echo "Fixed: '$file'"
    cat $tmp > "$file"
  else
    echo "Failed to fix: '$file'"
  fi
done
rm $tmp

Speichern Sie dieses Skript unter fix-encoding.sh, geben Sie ihm die Ausführungsberechtigung chmod +x fix-encoding.shund verwenden Sie es wie folgt:

./fix-encoding.sh myfile.txt my2ndfile.srt my3rdfile.sub

Dieses Skript versucht, die Codierung einer beliebigen Anzahl von Dateien zu korrigieren, die als Eingabe bereitgestellt werden. Beachten Sie, dass die Dateien an Ort und Stelle repariert werden, sodass der Inhalt überschrieben wird.

Seyed Mohammad
quelle
Sie müssen $ file nicht aus "  ...  " setzen, da Variablen sowohl in Anführungszeichen als auch in offenem Text erweitert werden. Nur '$ file' wird durch Bash buchstäblich mit Dollarzeichen gerendert.
Incnis Mrsi
Wie ich als Antwort auf die Antwort von 'Incnis Mrsi' erwähnte, funktionierte diese Lösung nicht und dieses Skript auch nicht.
Seyed Mohammad
1

Ich weiß nicht, ob dies mit Farsi funktioniert: Ich verwende Gedit, es gibt einen Fehler mit falscher Codierung und ich kann wählen, was ich in UTF-8 übersetzen möchte. Es war nur ein Text ohne beleuchtetes Format, aber hier ist ein Screenshot !

Bildbeschreibung hier eingeben

Tut mir leid, dass ich endlich meine Textdateien durchgegangen bin, jetzt sind sie alle konvertiert.

Ich habe auch notepad ++ geliebt, vermisse es immer noch.

Ken Mollerup
quelle
Gedit kann das Problem nicht beheben. Obwohl Gedit keinen Codierungsfehler für meine Datei anzeigt, kann dies auch nicht behoben werden. Ich habe auch versucht, mit UTF-8-Codierung in Gedit "Speichern unter", aber es behebt das Problem nicht.
Seyed Mohammad
1

Wenn Sie gerne in GUI anstatt in CLI arbeiten, wie ich es tue:

  1. Datei mit Geany (Editor) öffnen
  2. Gehen Sie zum Menü Datei -> Neu laden als
  3. Wählen Sie die angenommene Codierung, um den Kauderwelsch in identifizierbare Zeichen in Ihrer Sprache zu ändern. Um beispielsweise griechische Subs zu lesen, würde ich als westeuropäisch -> griechisch (Windows-1253) nachladen.
  4. Gehen Sie zum Menü Dokument > Codierung einstellen -> Unicode -> UTF-8
  5. speichern
Christos
quelle
Funktioniert nicht ..
Aurimas
0

Die funktionierende Lösung, die ich gefunden habe, ist die Verwendung des Freeware-Texteditors Microsoft Visual Studio Code, der für Linux verfügbar ist.

Öffnen Sie die Datei, deren Kodierung Sie konvertieren möchten, in VS-Code. Am unteren Rand des Fensters befinden sich einige Schaltflächen. Eine davon hängt mit der Dateicodierung zusammen, wie unten gezeigt:

Bildbeschreibung hier eingeben

Durch Klicken auf diese Schaltfläche wird ein Overhead-Menü mit zwei Elementen geöffnet. Wählen Sie in diesem Menü die Option "Erneut mit Codierung öffnen" wie folgt aus:

Bildbeschreibung hier eingeben

Dies öffnet ein weiteres Menü, das eine Liste mit verschiedenen Kodierungen enthält, wie unten gezeigt. Wählen Sie nun "Arabisch (Windows 1256)":

Bildbeschreibung hier eingeben

Dies wird den Kauderwelschtext wie folgt korrigieren:

Bildbeschreibung hier eingeben

Klicken Sie nun erneut auf die Codierungsschaltfläche und wählen Sie dieses Mal die Option "Mit Codierung speichern" wie folgt aus:

Bildbeschreibung hier eingeben

Und im neuen Menü wählen Sie die Option "UTF-8":

Bildbeschreibung hier eingeben

Dadurch wird die korrigierte Datei mit der UTF-8-Codierung gespeichert:

Bildbeschreibung hier eingeben

Erledigt! :)

Seyed Mohammad
quelle
Versucht "Mit Codierung speichern", zeigt aber den vorherigen Codierungs-Agian an, in meinem Fall UTF8
chaitanya 10.10.19