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:
In Windows kann dies einfach mit Notepad ++ behoben werden , um die Codierung in UTF-8 zu konvertieren, wie unten dargestellt:
Und das korrekte lesbare Ergebnis sieht so aus:
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 iconv
und , recode
aber 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 .
vim '+set fileencoding=utf-8' '+wq' file.txt
.iso-639
aber das scheint nicht in entweder vorhanden zu seiniconv
oderrecode
. Zumindest sehe ich es nicht in der Ausgabe voniconv -l
.vim
aber es hat nicht funktioniert.Antworten:
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)
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:
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.quelle
iconv
) funktionierte. Aber die erste (mitrecode
) funktionierte nicht richtig und die Ausgabe war immer noch Kauderwelsch. Bearbeiten Sie Ihre Antwort so, dass sie nur deniconv
Befehl enthält, und ich markiere sie als Antwort.iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txt
ich getestet und gearbeitet habe. Daher ist es möglicherweise eine gute Idee, Ihren Befehl so zu bearbeiten.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 ...
quelle
Als ergänzende Lösung für das Problem habe ich ein nützliches Bash-Skript vorbereitet, das auf dem
iconv
Befehl von Incnis Mrsis Antwort basiert :Speichern Sie dieses Skript unter
fix-encoding.sh
, geben Sie ihm die Ausführungsberechtigungchmod +x fix-encoding.sh
und verwenden Sie es wie folgt: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.
quelle
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 !
Tut mir leid, dass ich endlich meine Textdateien durchgegangen bin, jetzt sind sie alle konvertiert.
Ich habe auch notepad ++ geliebt, vermisse es immer noch.
quelle
Wenn Sie gerne in GUI anstatt in CLI arbeiten, wie ich es tue:
quelle
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:
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:
Dies öffnet ein weiteres Menü, das eine Liste mit verschiedenen Kodierungen enthält, wie unten gezeigt. Wählen Sie nun "Arabisch (Windows 1256)":
Dies wird den Kauderwelschtext wie folgt korrigieren:
Klicken Sie nun erneut auf die Codierungsschaltfläche und wählen Sie dieses Mal die Option "Mit Codierung speichern" wie folgt aus:
Und im neuen Menü wählen Sie die Option "UTF-8":
Dadurch wird die korrigierte Datei mit der UTF-8-Codierung gespeichert:
Erledigt!
:)
quelle