iconv generiert UTF-16 mit Stückliste


11

Kann ich, inspiriert von dieser Frage , den iconvBefehl verwenden, um eine UTF-16-Ausgabe mit einer Stückliste und mit der angegebenen Endianität zu generieren?

Der iconvBefehl 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 FFoder sind FF FE.

Der iconvBefehl 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-16lewird 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-16beoder utf-16levoranstellen, suche jedoch nach einer Lösung, die nur den iconvBefehl verwendet.

Eine andere Problemumgehung, wenn Sie wissen, was Endianness -t utf-16erzeugt, 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 iconvnicht.

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

1
Eine Stückliste verringert die Portabilität der Daten, aber Sie können sie auf diese Weise hinzufügen
RedGrittyBrick

@ RedGrittyBrick: Wie wird die Portabilität reduziert (speziell für UtF-16)? Ich weiß, dass ich die Stückliste ezplicit generieren kann; Ich suche nach einer Möglichkeit, dies nur mit zu tun iconv- und frage mich, warum -t utf-16die Endianness scheinbar nicht spezifiziert ist.
Keith Thompson

Ich denke, iconv geht von der aktuellen Reihenfolge der Plattformbytes aus, wenn Sie diese nicht explizit angeben. Auf einigen anderen Plattformen als Windows erwarten einige Textverarbeitungstools keine Stücklisten und machen daher das Falsche. Ein Beispiel könnte sein, wenn Sie Textdateien verketten oder dateibasierte Vorlagen zum Erstellen von Inhalten verwenden. "Für die von IANA registrierten Zeichensätze UTF-16BE und UTF-16LE sollte keine Bytereihenfolge verwendet werden, da die Namen dieser Zeichensätze bereits die Bytereihenfolge bestimmen"
RedGrittyBrick

Diese Frage zeigt 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.
Keith Thompson

Antworten:


9

Nein , wenn Sie die Bytereihenfolge angeben, iconvwird keine Stückliste eingefügt.

Dies ist vom Unicode-Konsortium

F: Wie soll ich mit Stücklisten umgehen?

A: Hier sind einige Richtlinien, die befolgt werden müssen:

  1. Für ein bestimmtes Protokoll (z. B. Microsoft-Konventionen für TXT-Dateien) muss möglicherweise die Stückliste für bestimmte Unicode-Datenströme verwendet werden, z. B. für Dateien. Wenn Sie einem solchen Protokoll entsprechen müssen, verwenden Sie eine Stückliste.
  2. Einige Protokolle erlauben optionale Stücklisten für Text ohne Tags. In diesen Fällen
    • Wenn bekannt ist, dass ein Textdatenstrom einfacher Text ist, jedoch eine unbekannte Codierung aufweist, kann die Stückliste als Signatur verwendet werden. Wenn keine Stückliste vorhanden ist, kann die Codierung beliebig sein.
    • Wenn bekannt ist, dass ein Textdatenstrom einfacher Unicode-Text ist (aber nicht welcher Endian), kann die Stückliste als Signatur verwendet werden. Wenn keine Stückliste 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 der Stückliste als Signatur für das Codierungsformular vermieden werden.
  4. Wenn der genaue Typ des Datenstroms bekannt ist (z. B. Unicode-Big-Endian oder Unicode-Little-Endian), sollte die Stückliste nicht verwendet werden. Insbesondere darf eine Stückliste nicht verwendet werden , wenn ein Datenstrom als UTF-16BE, UTF-16LE, UTF-32BE oder UTF-32LE deklariert wird.

(meine Betonung)

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


Aktualisieren.

Ein Exkurs

Meiner Meinung nach:

  1. Eine Option zum Angeben einer Stückliste wäre sicherlich eine nützliche zusätzliche Funktion für iconv.

  2. 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.

  3. 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.

  4. 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.

  5. 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 ".


1
Und was ist mit der ersten Richtlinie, A.1? Wenn ich eine Unicode-Textdatei generieren möchte, die auf einem x86-Windows-System verwendet werden kann, sollte es sich um eine Little-Endian-UTF16-Datei mit einer Stückliste handeln .
Keith Thompson

@KeithThompson: Systeme sollten sowohl UTF16LE als auch UTF16BE akzeptieren . Zumindest Windows Notepad akzeptiert beides, wenn es um .txts geht - solange die Datei eine Stückliste hat.
Benutzer1686

@KeithThompson: Ich stimme zu, dass Richtlinie 1 Vorrang haben sollte, jedoch bietet iconv keine Möglichkeit, eine Stückliste anzugeben. Die Antwort auf Ihre ursprüngliche Frage lautet einfach "Nein".
RedGrittyBrick

Nicht die Antwort, auf die ich gehofft hatte, sondern eine Antwort und eine gründliche!
Keith Thompson

2
Diese Antwort hat mir geholfen - hat mir geholfen zu lernen, warum ich geschraubt wurde. Das Standard-Windows-Programm zum Exportieren / Importieren aus der Registrierung C:\Windows\System32\reg.exeexportiert 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.)
Davidbak
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.