FileReader.readAsText
учитывает кодировку файла. В частности, поскольку у вас есть файл, закодированный в UTF-8, может быть несколько байтов на символ. Читая это как текст, UTF-8 читается как есть, и вы получаете свою строку.
FileReader.readAsBinaryString
, с другой стороны, делает именно то, что говорит. Он читает файл побайтно. Он не распознает многобайтовые символы, что, в частности, является хорошей новостью для двоичных файлов (в основном всего, кроме текстового файла). Так как & pi; двухбайтовый символ, вы получаете два отдельных байта, которые составляют его в вашей строке.
Эту разницу можно увидеть во многих местах. В частности, когда кодировка потеряна и вы видите символы, подобные & # xe9; отображается как & # xc3; & # xa9;.