Поскольку Берги уже ответил, вы должны использовать readAsArrayBuffer
для двоичных данных вместо readAsText
, так как последний декодирует последовательности байтов по умолчанию как UTF-8.
UTF-8 - кодировка переменной длины, где символ может быть от 1 до 4 байтов. Запуск декодера на двоичных данных, отличных от UTF-8, приведет к необратимому повреждению двоичных данных.
Например, только 0x00-0x7F копируется дословно. От 0xC2 до 0xDF - начальная последовательность 2-байтовой последовательности, от 0xE0 до 0xEF 3-байтовой последовательности и от 0xF0 до 0xFF 4-байтовой последовательности. От 0x80 до 0xBF является частью последовательности.
Вот несколько примеров того, как это повреждается (узел 12.1):
ORIGINAL => DECODED from UTF-8 to UCS-2 => ENOCDED from UCS-2 to UTF-8
----------------------------------------------------------------------------------------------------------------------
[0xC2,0x80,0x80,0x80] => [0x0080,0xFFFD,0xFFFD] => [0xC2,0x80,0xEF,0xBF,0xBD,0xEF,0xBF,0xBD]
[0xC3,0x80,0x80,0x80] => [0x00C0,0xFFFD,0xFFFD] => [0xC3,0x80,0xEF,0xBF,0xBD,0xEF,0xBF,0xBD]
[0xE0,0x80,0x80,0x80] => [0xFFFD,0xFFFD,0xFFFD,0xFFFD] => [0xEF,0xBF,0xBD,0xEF,0xBF,0xBD,0xEF,0xBF,0xBD,0xEF,0xBF,0xBD]
[0xE1,0x80,0x80,0x80] => [0x1000,0xFFFD] => [0xE1,0x80,0x80,0xEF,0xBF,0xBD]
[0xF0,0x80,0x80,0x80] => [0xFFFD,0xFFFD,0xFFFD,0xFFFD] => [0xEF,0xBF,0xBD,0xEF,0xBF,0xBD,0xEF,0xBF,0xBD,0xEF,0xBF,0xBD]
[0xF1,0x80,0x80,0x80] => [0xD8C0,0xDC00] => [0xF1,0x80,0x80,0x80]
[0xF0,0x80,0x00,0x00] => [0xFFFD,0xFFFD,0x0000,0x0000] => [0xEF,0xBF,0xBD,0xEF,0xBF,0xBD,0x00,0x00]
[0x80,0x80,0x80,0x80] => [0xFFFD,0xFFFD,0xFFFD,0xFFFD] => [0xEF,0xBF,0xBD,0xEF,0xBF,0xBD,0xEF,0xBF,0xBD,0xEF,0xBF,0xBD]
[0x81,0x82,0x83,0x84] => [0xFFFD,0xFFFD,0xFFFD,0xFFFD] => [0xEF,0xBF,0xBD,0xEF,0xBF,0xBD,0xEF,0xBF,0xBD,0xEF,0xBF,0xBD]
0xFFFD - это символ замены , который используется, когда вход не может быть преобразован в известную кодовую точку.