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
Odpowiedz
No cóż, jeśli to wszystko, czego potrzeba ... :)
CF80
jest kodowanie UTF-8 π.
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 à ©.
'CF80' to kodowanie UTF-8 dla π. – deceze
... o, masz rację ... dzięki! – gengkev
... to było chyba zbyt oczywiste, ale możesz to opublikować jako odpowiedź, jeśli chcesz. – gengkev