it-swarm.com.de

Windows-1252 bis UTF-8-Kodierung

Ich habe bestimmte Dateien von einem Windows-Computer auf einen Linux-Computer kopiert. Daher müssen alle Windows-kodierten Dateien (Windows-1252) in UTF-8 konvertiert werden. Die Dateien, die sich bereits in UTF-8 befinden, sollten nicht geändert werden. Ich plane, dafür das Dienstprogramm recode zu verwenden. Wie kann ich angeben, dass das recode-Dienstprogramm nur Windows-1252-kodierte Dateien und nicht die UTF-8-Dateien konvertieren soll?

Beispiel zur Verwendung von recode:

recode windows-1252.. myfile.txt

Dies würde myfile.txt von Windows-1252 nach UTF-8 konvertieren. Bevor ich dies tue, möchte ich wissen, dass myfile.txt tatsächlich Windows-1252 und nicht UTF-8 codiert ist. Ansonsten glaube ich, dass dies die Datei beschädigen würde.

31
Sam

Wie würden Sie erwarten, dass recode wissen soll, dass eine Datei Windows-1252 ist? Theoretisch glaube ich, dass any eine gültige Windows-1252-Datei ist, da jedes mögliche Byte einem Zeichen zugeordnet wird.

Nun gibt es sicherlich Merkmale, die stark deuten darauf hin dass es UTF-8 ist - wenn es beispielsweise mit der UTF-8-Stückliste beginnt -, aber sie wären nicht definitiv.

Eine Möglichkeit wäre zu erkennen, ob es sich tatsächlich um eine vollständig gültige UTF-8-Datei handelt, nehme ich an ... noch einmal, das wäre nur suggestiv.

Ich kenne das Recode-Tool selbst nicht, aber Sie möchten vielleicht sehen, ob es in der Lage ist, eine Datei von und in die gleiche Kodierung umzucodieren, wenn Sie dies mit einer ungültigen Datei tun (dh einer Datei, die ein ungültiges UTF enthält.) -8 Byte-Sequenzen) es kann die ungültigen Sequenzen durchaus in Fragezeichen oder ähnliches umwandeln. An diesem Punkt könnten Sie feststellen, dass eine Datei gültiges UTF-8 ist, indem Sie sie in UTF-8 umcodieren und prüfen, ob die Eingabe und Ausgabe identisch sind.

Alternativ können Sie dies programmgesteuert machen, anstatt das Dienstprogramm recode zu verwenden. Dies wäre beispielsweise in C # recht unkompliziert.

Nur um es noch einmal zu wiederholen: Alles ist heuristisch. Wenn Sie die Kodierung einer Datei wirklich nicht kennen, wird Ihnen dies mit 100% iger Genauigkeit nicht mitgeteilt.

37
Jon Skeet

sie können iconv verwenden:

iconv -f WINDOWS-1252 -t UTF-8 filename.txt

62
Gregory Pakosz

Hier ist eine Transkription einer anderen Antwort, die ich auf eine ähnliche Frage gab:

Wenn Sie utf8_encode () auf einen bereits vorhandenen UTF8-String anwenden, wird eine fehlerhafte UTF8-Ausgabe zurückgegeben.

Ich habe eine Funktion erstellt, die all diese Probleme anspricht. Es heißt Encoding :: toUTF8 ().

Sie müssen nicht wissen, wie die Codierung Ihrer Zeichenfolgen ist. Es kann Latin1 (ISO 8859-1), Windows-1252 oder UTF8 sein oder die Zeichenfolge kann eine Mischung aus ihnen enthalten. Encoding :: toUTF8 () konvertiert alles in UTF8.

Ich habe es getan, weil mir ein Dienst einen Datenvorrat lieferte, der alles durcheinander brachte und UTF8 und Latin1 in derselben Zeichenfolge mischte.

Verwendungszweck:

$utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);

$latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);

Herunterladen:

https://github.com/neitanod/forceutf8

Aktualisieren:

Ich habe eine weitere Funktion eingefügt, Encoding :: fixUFT8 (), die jeden UTF8-String reparieren wird, der verstümmelt aussieht. 

Verwendungszweck:

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);

Beispiele:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");

wird ausgeben:

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football

Update: Ich habe die Funktion (forceUTF8) in eine Familie statischer Funktionen in einer Klasse namens Encoding umgewandelt. Die neue Funktion ist Encoding :: toUTF8 ().

9

Es gibt keine generelle Möglichkeit, festzustellen, ob eine Datei mit einer bestimmten Codierung codiert ist. Denken Sie daran, dass eine Kodierung nichts anderes als eine "Vereinbarung" ist, wie die Bits in einer Datei Zeichen zugeordnet werden sollen.

Wenn Sie nicht wissen, welche Ihrer Dateien tatsächlich in UTF-8 und welche in Windows-1252 codiert sind, müssen Sie alle Dateien untersuchen und sich selbst davon überzeugen. Im schlimmsten Fall könnte dies bedeuten, dass Sie jede einzelne von ihnen mit einer der beiden Kodierungen öffnen müssen, um zu sehen, ob sie richtig "aussehen" - d. H., Alle Zeichen werden korrekt angezeigt. Natürlich können Sie die Tool-Unterstützung dazu verwenden. Wenn Sie beispielsweise sicher sind, dass bestimmte Zeichen in den Dateien enthalten sind, die in Windows-1252 eine andere Zuordnung als UTF-8 haben, könnten Sie dies tun Nach dem Ausführen der Dateien durch 'iconv', wie von Seva Akekseyev erwähnt.

Ein weiterer glücklicher Fall für Sie wäre, wenn Sie wissen, dass die Dateien tatsächlich nur Zeichen enthalten, die sowohl in UTF-8 als auch in Windows-1252 identisch codiert sind. In diesem Fall sind Sie natürlich schon fertig.

8
kleiba

Wenn Sie mehrere Dateien in einem einzigen Befehl umbenennen möchten - nehmen Sie an, Sie möchten alle *.txt-Dateien konvertieren - hier ist der Befehl:

find . -name "*.txt" -exec iconv -f WINDOWS-1252 -t UTF-8 {} -o {}.ren \; -a -exec mv {}.ren {} \;
5
Anthony O.

Verwenden Sie den Befehl iconv .

Um sicherzustellen, dass sich die Datei in Windows-1252 befindet, öffnen Sie sie im Editor (unter Windows) und klicken Sie dann auf Speichern unter. Der Editor schlägt die aktuelle Kodierung als Standard vor. Wenn es sich um Windows-1252 handelt (oder um eine 1-Byte-Codepage), würde es "ANSI" sagen.

2
Seva Alekseyev

Sie können die Kodierung einer Datei mit einem Editor wie Notepad ++ ändern. Gehen Sie einfach zu Encoding und wählen Sie aus, was Sie möchten.

Ich bevorzuge immer das Windows 1252

1
thanos.a

UTF-8 hat keine Stückliste, da diese sowohl überflüssig als auch ungültig ist. Wo eine Stückliste hilfreich ist, befindet sich in UTF-16, die wie bei Microsoft Byte ausgetauscht werden kann. UTF-16, falls für die interne Darstellung in einem Speicherpuffer. Verwenden Sie UTF-8 für den Austausch. Standardmäßig sind sowohl UTF-8 als auch alles andere, von US-ASCII und UTF-16 abgeleitete, natürliche/Netzwerk-Bytereihenfolge. Das Microsoft UTF-16 erfordert eine Stückliste, da Byte ausgetauscht wird.

Um Windows-1252 in ISO8859-15 zu verbergen, konvertiere ich zunächst ISO8859-1 in US-ASCII für Codes mit ähnlichen Glyphen. Ich konvertiere dann Windows-1252 bis ISO8859-15, andere Nicht-ISO8859-15-Glyphen in mehrere US-ASCII-Zeichen.

0

Diese Dokumentation für den TYPE-Befehl gefunden :

Konvertieren Sie eine ASCII (Windows1252) -Datei in eine Unicode-Datei (UCS-2-Datei): 

For /f "tokens=2 delims=:" %%G in ('CHCP') do Set _codepage=%%G    
CHCP 1252 >NUL    
CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > unicode.txt 2>NUL    
CMD.EXE /D /U /C TYPE ascii_file.txt >> unicode.txt    
CHCP %_codepage%    

Die obige Technik (basierend auf einem Skript von Carlos M.) erstellt zunächst eine Datei mit einer Byte Order Mark (BOM) und hängt dann den Inhalt der Originaldatei an. Mit CHCP wird sichergestellt, dass die Sitzung mit der Windows1252-Codepage ausgeführt wird, sodass die Zeichen 0xFF und 0xFE (ÿþ) richtig interpretiert werden.

0
Napfkuchen

Wenn Sie sicher sind, dass Ihre Dateien entweder UTF-8 oder Windows 1252 (oder Latin1) sind, können Sie die Tatsache nutzen, dass recode mit einem Fehler beendet wird, wenn Sie versuchen, eine ungültige Datei zu konvertieren.

Während utf8 für Win-1252 gültig ist, ist die Umkehrung nicht wahr: Win-1252 ist NICHT gültig für UTF-8. So:

recode utf8..utf16 <unknown.txt >/dev/null || recode cp1252..utf8 <unknown.txt >utf8-2.txt

Spuckt Fehler für alle cp1252-Dateien aus und konvertiert sie anschließend in UTF8.

Ich würde dies in ein saubereres Bash-Skript einpacken und eine Sicherungskopie aller konvertierten Dateien aufbewahren.

Bevor Sie die Zeichensatzkonvertierung durchführen, sollten Sie zunächst sicherstellen, dass in allen Dateien konsistente Zeilenenden vorhanden sind. Andernfalls wird sich recode darüber beschweren und konvertiert möglicherweise Dateien, die bereits UTF8 waren, aber nur die falschen Zeilenenden hatten.

0
mivk