2012-02-19 3 views
6

Так, например, когда я читаю символ π (\u03C0) из файла с использованием API FileReader, я возвращаю символ pi, когда читаю его, используя FileReader.readAsText(blob), который ожидается. Но когда я использую FileReader.readAsBinaryString(blob), я получаю вместо этого результат \xcf\x80, который, похоже, не имеет видимой корреляции с символом pi. Что происходит? (Это, вероятно, что-то делать с тем, как UTF-8/16 кодируется ...)Разница между readAsBinaryString и readAsText с использованием FileReader

+2

'CF80' - кодировка UTF-8 для π. – deceze

+0

... о, ты прав ... спасибо! – gengkev

+0

... это было, вероятно, слишком очевидно, но вы можете опубликовать это как ответ, если хотите. – gengkev

ответ

2

Ну хорошо, если это все, что вам нужно ... :)

CF80 это кодировка UTF-8 для π.

12

FileReader.readAsText учитывает кодировку файла. В частности, поскольку у вас есть файл, закодированный в UTF-8, может быть несколько байтов на символ. Читая его как текст, UTF-8 читается так, как есть, и вы получаете свою строку.

FileReader.readAsBinaryString, с другой стороны, делает именно то, что он говорит. Он читает байтовый файл байтом. Он не распознает многобайтовые символы, что, в частности, является хорошей новостью для двоичных файлов (в основном ничего, кроме текстового файла). Поскольку π является двухбайтным символом, вы получаете два отдельных байта, которые составляют его в вашей строке.

Это различие можно увидеть во многих местах. В частности, когда кодирование теряется, и вы видите символы, такие как é, отображаемые как Ã ©.

+0

спасибо ... поэтому, когда я пытаюсь добавить \ xA2 в BlobBuilder, он получается как \ xC2 \ xA2, потому что это то, что кодируется UTF-8, но как я могу вернуться \ xA2? (это однобайтовый символ) – gengkev

+0

О, я думаю, мне нужно использовать ArrayBuffer, тогда – gengkev

Смежные вопросы