Kann ich, inspiriert von dieser Frage , den iconv
Befehl verwenden, um eine UTF-16-Ausgabe mit einer Stückliste und mit der angegebenen Endianität zu generieren?
Der iconv
Befehl konvertiert Text von einer Codierung in eine andere.
Beispielsweise:
echo hello | iconv -f ascii -t utf-16
generiert eine UTF-16-Darstellung von "hello\n"
.
UTF-16-Dateien beginnen häufig, aber nicht immer, mit einem Byte Order Mark (BOM), einer 2-Byte-Codierung des Unicode-Zeichens U+FEFF
. Sie können die Endianität einer UTF-16-Datei mit Stückliste bestimmen, indem Sie prüfen, ob die ersten beiden Bytes FE FF
oder sind FF FE
.
Der iconv
Befehl verfügt über mehrere Optionen zum Generieren der UTF-16-Ausgabe:
$ iconv --list | grep -i utf-16
UTF-16//
UTF-16BE//
UTF-16LE//
Dieser Befehl:
echo hello | iconv -f ascii -t utf-16be
generiert Big-Endian-UTF-16 ohne Stückliste ; Es scheint anzunehmen, dass Sie, wenn Sie die Endianness angegeben haben, diese nicht in der Ausgabe angeben müssen. In ähnlicher Weise utf-16le
wird Little-Endian-UTF-16 ohne Stückliste generiert.
Dies:
echo hello | iconv -f ascii -t utf-16
generiert (auf meinem x86-Ubuntu-System) Little-Endian-UTF-16 mit einer Stückliste - aber ich habe einen Bericht über einen ähnlichen Befehl gesehen, der Big-Endian-UTF-16 mit einer Stückliste generiert, selbst auf einem Little-Endian-System.
Ich kann die Stückliste immer manuell verwenden utf-16be
oder utf-16le
voranstellen, suche jedoch nach einer Lösung, die nur den iconv
Befehl verwendet.
Eine andere Problemumgehung, wenn Sie wissen, was Endianness -t utf-16
erzeugt, ist:
echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null
Was würde I mag zu verwenden ist so etwas wie:
iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM
unterstützt das aber iconv
nicht.
EDIT:
Kann jemand mit Zugriff auf ein x86 Mac OSX-System einen Kommentar veröffentlichen, der die (kopierte und eingefügte) Ausgabe des folgenden Befehls zeigt?
echo hello | iconv -f ascii -t utf-16 | od -x
iconv
- und frage mich, warum-t utf-16
die Endianness scheinbar nicht spezifiziert ist.iconv -f UTF-8 -t UTF-16
, dass auf einem Little-Endian-System (MacOS) Big-Endian-UTF-16 mit einer Stückliste generiert wird, was sehr seltsam erscheint.Antworten:
Nein , wenn Sie die Bytereihenfolge angeben,
iconv
wird keine Stückliste eingefügt.Dies ist vom Unicode-Konsortium
(meine Betonung)
Ich gehe davon aus, dass
iconv
versucht wird, der letzten dieser Richtlinien treu zu bleiben.Aktualisieren.
Ein Exkurs
Meiner Meinung nach:
Eine Option zum Angeben einer Stückliste wäre sicherlich eine nützliche zusätzliche Funktion für iconv.
Eine UTF-16LE Datei ohne BOM ist verwendbar in Windows, wenn auch mit zusätzlichem Aufwand manchmal. Im Dialogfeld "Datei öffnen" von Notepad können Sie beispielsweise "Unicode" auswählen, den Microsoft-Namen für "UTF-16LE", und (nicht überraschend) scheint für Dateien ohne Stückliste zu funktionieren.
Ich kann eine UTF-16LE-Testdatei (ohne Stückliste) oder eine UTF-8-Testdatei (ohne Stückliste) in Windows Notepad (XP) auf die übliche Weise öffnen, z. B. durch Doppelklicken auf den Dateinamen im Explorer. Das scheint mir brauchbar. Mir ist bekannt, dass Windows manchmal die Codierung falsch errät. In diesem Fall müssen Sie Notepad die Codierung beim Öffnen der Datei mitteilen. Diese Unannehmlichkeit bedeutet, dass das Einfügen einer Stückliste für Textdateien, die unter Windows verwendet werden sollen, vorzuziehen ist.
Wenn eine bestimmte Anwendung nur mit einer UTF-16LE-Datei mit Stückliste funktioniert, würde ich zustimmen, dass eine UTF-16LE-Datei ohne Stückliste für diese bestimmte Anwendung nicht verwendet werden kann.
Ich vermute, wenn Sie alles mit UTF-8 (ohne Stückliste) zum Laufen bringen können, ist dies auf lange Sicht die beste Lösung.
Die Antwort auf die Frage " Kann ich den Befehl iconv verwenden, um eine UTF-16-Ausgabe mit einer Stückliste und mit der angegebenen Endianness zu generieren? " Lautet derzeit " Nein ".
quelle
.txt
s geht - solange die Datei eine Stückliste hat.C:\Windows\System32\reg.exe
exportiert UTF-16 LE MIT Stückliste und liest nur UTF-16 LE MIT Stückliste - liest UTF-16 LE ohne Stückliste nicht und liest UTF-16 BE mit Stückliste nicht - Mit anderen Worten, es verlangt die Stückliste beim Lesen, aber es ist verdammt noch mal besser, die richtige zu sein! (Zum Glück liest es UTF-8.)