webentwicklung-frage-antwort-db.com.de

Hinzufügen von UTF-8-Stücklisten zu Zeichenfolge / Blob

Ich muss generierten Textdaten auf der Clientseite eine UTF-8-Byte-Ordnungsmarke hinzufügen. Wie mache ich das?

Die Verwendung von new Blob(['\xEF\xBB\xBF' + content]) ergibt '"my data"', Na sicher.

Weder hat '\uBBEF\x22BF' arbeiten mit '\x22' == '"' ist das nächste Zeichen in content).

Kann die UTF-8-Stückliste in JavaScript einem generierten Text vorangestellt werden?

Ja, ich brauche in diesem Fall wirklich die UTF-8-Stückliste.

42
kay

Stellen Sie der Zeichenfolge \ufeff Voran. Siehe http://msdn.Microsoft.com/en-us/library/ie/2yfce773 (v = vs.94) .aspx

Siehe Diskussion zwischen @ jeff-fischer und @ caseyfür Details zu UTF-8 und UTF-16 und der Stückliste. Was die obige Funktion tatsächlich ausmacht, ist, dass die Zeichenfolge \ufeff Immer zur Darstellung der Stückliste verwendet wird, unabhängig davon, ob UTF-8 oder UTF-16 verwendet wird.

Eine ausführliche Erläuterung finden Sie auf S.36 in The Unicode Standard 5.0, Kapitel 2 . Ein Zitat von dieser Seite

Der Eintrag für die Endian-Reihenfolge für UTF-8 in Tabelle 2-4 ist mit N/A gekennzeichnet, da UTF-8-Codeeinheiten 8 Bit groß sind und die üblichen Probleme der Endian-Reihenfolge für größere Codeeinheiten nicht zutreffen. Die serialisierte Reihenfolge der Bytes darf nicht von der im UTF-8-Codierungsformular festgelegten Reihenfolge abweichen. Die Verwendung einer Stückliste ist für UTF-8 weder erforderlich noch empfohlen, kann jedoch in Kontexten auftreten, in denen UTF-8-Daten aus anderen Codierungsformen konvertiert werden, die eine Stückliste verwenden, oder in denen die Stückliste als UTF-8-Signatur verwendet wird.

Ich hatte das gleiche Problem und dies ist die Lösung, die ich gefunden habe:

var blob = new Blob([
                    new Uint8Array([0xEF, 0xBB, 0xBF]), // UTF-8 BOM
                    "Text",
                    ... // Remaining data
                    ],
                    { type: "text/plain;charset=utf-8" });

Die Verwendung von Uint8Array Verhindert, dass der Browser diese Bytes in einen String konvertiert (getestet auf Chrome und Firefox)).

Sie sollten text/plain Durch Ihren gewünschten MIME-Typ ersetzen.

13
carlosrafaelgn

Ich bearbeite meine ursprüngliche Antwort. Die obige Antwort erfordert wirklich Ausarbeitung, da dies eine verschachtelte Lösung von Node.js ist.

Die kurze Antwort lautet: Ja, dieser Code funktioniert.

Die lange Antwort lautet: Nein, FEFF ist nicht die Byte-Ordnungsmarke für utf-8. Anscheinend hat node eine Abkürzung zum Schreiben von Kodierungen in Dateien verwendet. FEFF ist die UTF16-Little-Endian-Codierung, die im Wikipedia-Artikel Byte Order Mark zu sehen ist und auch nach dem Schreiben der Datei in einem binären Texteditor angezeigt werden kann. Ich habe überprüft, ob dies der Fall ist.

http://en.wikipedia.org/wiki/Byte_order_mark#Representations_of_byte_order_marks_by_encoding

Anscheinend verwendet Node.JS den\ufeff, um eine beliebige Anzahl von Codierungen zu kennzeichnen . Es nimmt den\ufeff-Marker und konvertiert ihn basierend auf dem 3. options-Parameter von writeFile in die richtige Bytereihenfolge. Der dritte Parameter, den Sie in der Codierungszeichenfolge übergeben. Node.JS verwendet diese Codierungszeichenfolge und konvertiert die\ufeff-Festbytecodierung in eine der Bytereihenfolgemarkierungen der tatsächlichen Codierung.

UTF-8 Beispiel:

fs.writeFile(someFilename, '\ufeff' + html, { encoding: 'utf8' }, function(err) {
   /* The actual byte order mark written to the file is EF BB BF */
}

UTF-16 Little Endian Beispiel:

fs.writeFile(someFilename, '\ufeff' + html, { encoding: 'utf16le' }, function(err) {
   /* The actual byte order mark written to the file is FF FE */
}

Wie Sie sehen können, ist der\ufeff einfach ein Marker, der eine beliebige Anzahl von resultierenden Codierungen angibt. Die tatsächliche Kodierung, die es in die Datei schafft, hängt direkt von der angegebenen Kodierungsoption ab. Der in der Zeichenfolge verwendete Marker ist für das, was in die Datei geschrieben wird, wirklich irrelevant.

Ich vermute, dass die Begründung dahinter liegt, dass sie keine Bytereihenfolgemarken geschrieben haben und die 3-Byte-Marke für UTF-8 nicht einfach in die Javascript-Zeichenfolge codiert werden kann, die auf die Festplatte geschrieben werden soll. Daher verwendeten sie die UTF16LE-Stückliste als Platzhalter in der Zeichenfolge, die beim Schreiben ersetzt wird.

13
Jeff Fischer

Das ist meine Lösung:

var blob = new Blob(["\uFEFF"+csv], {
type: 'text/csv; charset=utf-18'
});
0
Santy SC