2012-02-19 17 views
6

Przykładowo, po odczytaniu znaku π (\u03C0) z pliku przy użyciu interfejsu API FileReader otrzymuję znak pi, gdy go czytam, używając oczekiwanego FileReader.readAsText(blob). Ale kiedy używam FileReader.readAsBinaryString(blob), otrzymuję zamiast tego wynik \xcf\x80, który wydaje się nie mieć żadnej widocznej korelacji ze znakiem pi. Co się dzieje? (To chyba ma coś wspólnego ze sposobem, UTF-8/16 jest kodowany ...)Różnica między readAsBinaryString a readAsText za pomocą FileReadera

+2

'CF80' to kodowanie UTF-8 dla π. – deceze

+0

... o, masz rację ... dzięki! – gengkev

+0

... to było chyba zbyt oczywiste, ale możesz to opublikować jako odpowiedź, jeśli chcesz. – gengkev

Odpowiedz

2

No cóż, jeśli to wszystko, czego potrzeba ... :)

CF80 jest kodowanie UTF-8 π.

12

uwzględnia kodowanie pliku. W szczególności, ponieważ masz plik zakodowany w UTF-8, może być wiele bajtów na znak. Odczytując go jako tekst, kodowanie UTF-8 jest odczytywane bez zmian, a otrzymasz ciąg znaków.

FileReader.readAsBinaryString, z drugiej strony, robi dokładnie to, co mówi. Odczytuje bajt pliku po bajcie. Nie rozpoznaje znaków wielobajtowych, co w szczególności jest dobrą wiadomością dla plików binarnych (w zasadzie wszystko oprócz pliku tekstowego). Ponieważ π jest dwubajtową postacią, otrzymasz dwa pojedyncze bajty, które tworzą ją w twoim ciągu.

Ta różnica może być widoczna w wielu miejscach. W szczególności, gdy kodowanie zostanie utracone i pojawią się znaki takie jak é wyświetlane jako à ©.

+0

dzięki ... więc gdy próbuję dodać \ xA2 do BlobBuilder, okazuje się, że jest to \ xC2 \ xA2, ponieważ jest to kodowane w UTF-8, ale jak mogę odzyskać \ xA2? (jest to znak jednobajtowy) – gengkev

+0

oh, myślę, że muszę użyć ArrayBuffer – gengkev