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.