Aggiunta di BOM UTF-8 a stringa / BLOB

Devo aggiungere un segno di ordine byte UTF-8 ai dati di testo generati sul lato client. Come lo faccio?

Utilizzando il new Blob(['\xEF\xBB\xBF' + content]) ottengono '"my data"' , ovviamente.

Né funziona '\uBBEF\x22BF' (con '\x22' == '"' è il prossimo carattere nel content ).

È ansible anteporre il BOM UTF-8 in JavaScript a un testo generato?

Sì, in questo caso ho davvero bisogno del BOM UTF-8.

\ufeff alla stringa. Vedi http://msdn.microsoft.com/en-us/library/ie/2yfce773(v=vs.94).aspx

Vedi la discussione tra @ jeff-fischer e @casey per i dettagli su UTF-8 e UTF-16 e il BOM. Ciò che effettivamente fa il lavoro di cui sopra è che la stringa \ufeff viene sempre usata per rappresentare la distinta base, indipendentemente \ufeff di UTF-8 o UTF-16.

Vedi p.36 in The Unicode Standard 5.0, Capitolo 2 per una spiegazione dettagliata. Una citazione da quella pagina

La voce di ordine endian per UTF-8 nella Tabella 2-4 è contrassegnata N / D poiché le unità di codice UTF-8 hanno una dimensione di 8 bit e non si applicano i normali problemi di macchina di ordine endian per unità di codice più grandi. L’ordine serializzato dei byte non deve discostarsi dall’ordine definito dal modulo di codifica UTF-8. L’uso di una distinta materiali non è né richiesto né consigliato per UTF-8, ma può essere riscontrato in contesti in cui i dati UTF-8 vengono convertiti da altri moduli di codifica che utilizzano una distinta componenti o in cui la distinta materiali viene utilizzata come firma UTF-8.

Sto modificando la mia risposta originale. La risposta sopra richiede davvero elaborazione poiché questa è una soluzione contorta di Node.js.

La risposta breve è, sì, questo codice funziona.

La risposta lunga è, no, FEFF non è il byte order mark per utf-8. Apparentemente il nodo ha preso una sorta di scorciatoia per scrivere le codifiche all’interno dei file. FEFF è la codifica UTF16 di Little Endian che può essere vista all’interno dell’articolo Byte Order Mark wikipedia e può anche essere visualizzata all’interno di un editor di testo binario dopo aver scritto il file. Ho verificato che questo è il caso.

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

Apparentemente, Node.JS usa \ ufeff per indicare qualsiasi numero di codifica . Prende il marcatore \ ufeff e lo converte nel giusto ordine di byte in base al terzo parametro delle opzioni di writeFile. Il terzo parametro che passi nella stringa di codifica. Node.JS accetta questa stringa di codifica e converte la codifica di byte fissi \ ufeff in uno qualsiasi dei segni di ordine dei byte della codifica effettiva.

Esempio UTF-8:

 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 Esempio:

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

Quindi, come puoi vedere, \ ufeff è semplicemente un indicatore che indica un numero qualsiasi di codifiche risultanti. La codifica effettiva che lo fa nel file dipende direttamente dall’opzione di codifica specificata. Il marcatore utilizzato all’interno della stringa è davvero irrilevante per ciò che viene scritto nel file.

Sospetto che il ragionamento alla base di questo sia dovuto al fatto che hanno scelto di non scrivere segni di ordinamento dei byte e il segno di 3 byte per UTF-8 non è facilmente codificato nella stringa javascript per essere scritto sul disco. Quindi, hanno usato la distinta base UTF16LE come un segnaposto all’interno della stringa che viene sostituita in fase di scrittura.

Ho avuto lo stesso problema e questa è la soluzione che ho trovato:

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

L’uso di Uint8Array impedisce al browser di convertire quei byte in stringa (testato su Chrome e Firefox).

Dovresti sostituire text/plain con il tipo MIME desiderato.