2012-02-19 11 views
6

Quindi, ad esempio, quando leggo il carattere π (\u03C0) da un file utilizzando l'API FileReader, mi viene restituito il carattere pi quando l'ho letto utilizzando FileReader.readAsText(blob) che è previsto. Ma quando uso FileReader.readAsBinaryString(blob), ottengo invece il risultato \xcf\x80, che non sembra avere alcuna correlazione visibile con il carattere pi. Cosa sta succedendo? (Questo probabilmente ha qualcosa a che fare con il modo in cui è codificato UTF-8/16 ...)Differenza tra readAsBinaryString e readAsText utilizzando FileReader

+2

'CF80' è la codifica UTF-8 per π. – deceze

+0

... oh, hai ragione ... grazie! – gengkev

+0

... probabilmente era troppo ovvio, ma puoi postarlo come risposta, se vuoi. – gengkev

risposta

2

Vabbè, se questo è tutto il necessario ... :)

CF80 è la codifica UTF-8 per π.

12

FileReader.readAsText prende la codifica del file in considerazione. In particolare, poiché il file è codificato in UTF-8, potrebbero esserci più byte per carattere. Leggendolo come testo, l'UTF-8 viene letto così com'è e ottieni la tua stringa.

FileReader.readAsBinaryString, d'altra parte, fa esattamente quello che dice. Legge il file byte per byte. Non riconosce i caratteri multi-byte, che in particolare sono una buona notizia per i file binari (in pratica qualsiasi cosa eccetto un file di testo). Poiché π è un carattere a due byte, si ottengono i due singoli byte che compongono la stringa.

Questa differenza può essere vista in molti posti. In particolare quando la codifica viene persa e vengono visualizzati caratteri come é visualizzati come à ©.

+0

grazie ... quindi quando provo ad aggiungere \ xA2 a un BlobBuilder risulta come \ xC2 \ xA2 perché è codificato in UTF-8, ma come posso tornare \ xA2? (è un carattere a byte singolo) – gengkev

+0

oh, credo di dover usare un ArrayBuffer quindi – gengkev