iconv generiert UTF-16 mit BOM

iconv generiert UTF-16 mit BOM

Inspiriert vondiese Frage, kann ich den iconvBefehl verwenden, um eine UTF-16-Ausgabe mit einer BOM und mit angegebener Byte-Reihenfolge zu generieren?

Der iconvBefehl konvertiert Text von einer Kodierung in eine andere.

Zum Beispiel:

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 einer Byte Order Mark (BOM), einer 2-Byte-Kodierung des Unicode-Zeichens U+FEFF. Sie können die Byte-Reihenfolge einer UTF-16-Datei mit BOM bestimmen, indem Sie prüfen, ob die ersten beiden Bytes FE FFoder sind FF FE.

Der iconvBefehl bietet mehrere Optionen zum Generieren einer 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-16ohne Stückliste; es scheint davon auszugehen, dass Sie die Byte-Reihenfolge, wenn Sie sie angegeben haben, nicht in der Ausgabe angeben müssen. In ähnlicher Weise utf-16lewird Little-Endian-UTF-16 ohne BOM generiert.

Das:

echo hello | iconv -f ascii -t utf-16

generiert (auf meinem x86 Ubuntu-System) Little-Endian UTF-16mitein BOM - aber ich habe einen Bericht über einen ähnlichen Befehl gesehen, der Big-Endian-UTF-16 mit einem BOM generiert, sogar auf einem Little-Endian-System.

Ich kann immer utf-16be„oder“ verwenden utf-16leund die Stückliste manuell voranstellen, aber ich suche nach einer Lösung, die nur den iconvBefehl verwendet.

Eine weitere Problemumgehung,WennSie wissen, was die Byte-Reihenfolge -t utf-16erzeugt:

echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null

Welche IDwiezu verwenden ist etwa:

iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM

aber iconvunterstützt das nicht.

BEARBEITEN :

Kann jemand mit Zugriff auf ein x86-Mac-OSX-System einen Kommentar posten, der die (kopierte und eingefügte) Ausgabe des folgenden Befehls zeigt?

echo hello | iconv -f ascii -t utf-16 | od -x

Antwort1

NEINiconvfügt kein BOM ein , wenn Sie die Byte-Reihenfolge angeben .

Das ist vonDas Unicode-Konsortium

F: Wie sollte ich mit Stücklisten umgehen?

A: Hier sind einige Richtlinien, die Sie befolgen sollten:

  1. Ein bestimmtes Protokoll (z. B. Microsoft-Konventionen für TXT-Dateien) kann die Verwendung des BOM für bestimmte Unicode-Datenströme, z. B. Dateien, erfordern. Wenn Sie einem solchen Protokoll entsprechen müssen, verwenden Sie ein BOM.
  2. Einige Protokolle erlauben optionale BOMs bei nicht markiertem Text. In diesen Fällen
    • Wenn ein Textdatenstrom bekanntermaßen reiner Text ist, dessen Kodierung jedoch unbekannt ist, kann BOM als Signatur verwendet werden. Wenn kein BOM vorhanden ist, kann die Kodierung beliebig sein.
    • Wenn bekannt ist, dass es sich bei einem Textdatenstrom um einfachen Unicode-Text handelt (aber nicht um welchen Endian), kann BOM als Signatur verwendet werden. Wenn kein BOM vorhanden ist, sollte der Text als Big-Endian interpretiert werden.
  3. Einige byteorientierte Protokolle erwarten ASCII-Zeichen am Anfang einer Datei. Wenn UTF-8 mit diesen Protokollen verwendet wird, sollte die Verwendung des BOM als Signatur für die Kodierungsform vermieden werden.
  4. Wenn der genaue Typ des Datenstroms bekannt ist (z. B. Unicode Big-Endian oder Unicode Little-Endian), sollte das BOM nicht verwendet werden. Insbesondere wenn ein Datenstrom als UTF-16BE, UTF-16LE oder UTF-32BE deklariert ist oder UTF-32LE eine BOMdarf nichtverwendet werden.

(meine Hervorhebung)

Ich gehe davon aus iconv, dass versucht wird, der letzten dieser Richtlinien treu zu bleiben.


Aktualisieren.

Ein Exkurs

Meiner Meinung nach:

  1. Eine Möglichkeit zur Angabe einer Stückliste wäre sicherlich ein sinnvolles Zusatzfeature für iconv.

  2. Eine UTF-16LE-Datei ohne BOMIstunter Windows verwendbar, wenn auch manchmal mit zusätzlichem Aufwand. Beispielsweise können Sie im Dialogfeld „Datei öffnen“ von Notepad „Unicode“ auswählen, was Microsofts Name für „UTF-16LE“ ist und (wenig überraschend) bei Dateien ohne BOM zu funktionieren scheint.

  3. Ich kann eine UTF-16LE-Testdatei (ohne BOM) oder eine UTF-8-Testdatei (ohne BOM) im Windows-Editor (XP) auf die übliche Weise öffnen, z. B. indem ich im Explorer auf den Dateinamen doppelklicke. Das scheint mir brauchbar. Mir ist bewusst, dass Windows die Kodierung manchmal falsch errät. In diesem Fall müssen Sie dem Editor die Kodierung beim Öffnen der Datei mitteilen. Aufgrund dieser Unannehmlichkeit ist die Einbeziehung einer BOM für Textdateien, die für die Verwendung unter Windows vorgesehen sind, vorzuziehen.

  4. Wenn eine bestimmte Anwendung nur mit einer UTF-16LE-Datei mit BOM funktioniert, stimme ich zu, dass eine UTF-16LE-Datei ohne BOM für diese bestimmte Anwendung nicht verwendbar ist.

  5. Ich vermute, dassWennSie können alles mit UTF-8 (ohne BOM) zum Laufen bringen, das ist 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 BOM und mit angegebener Byte-Reihenfolge zu generieren" ist gerade "NEIN".

Antwort2

Wenn Sie die Stückliste zu einer Datei hinzufügen möchten, können Sie dies manuell tun:

Für UTF-8 BOM (EF BB BF)

file='main.cpp'
printf '\xEF\xBB\xBF' > $file.utf8
iconv -f ASCII -t UTF-8 $file >> $file.utf8
mv -v $file.utf8 "converted-$file"

Für UTF-16BE BOM (FE FF)

file='main.cpp'
printf '\xFE\xFF' > $file.utf16be
iconv -f ASCII -t UTF-16BE $file >> $file.utf16be
mv -v $file.utf16be "converted-$file"

Für UTF-16LE BOM (FF FE)

file='main.cpp'
printf '\xFF\xFE' > $file.utf16le
iconv -f ASCII -t UTF-16LE $file >> $file.utf16le
mv -v $file.utf16le "converted-$file"

Notiz:

Wahrscheinlich fällt Ihnen auf, dass die Stückliste in jedem Fall anders ist. Sie findenmehr Informationen hier:

verwandte Informationen