Доступ к двоичным данным из Javascript, Ajax, IE: можно ли прочитать ответ из Javascript (не VB)? - PullRequest
14 голосов
/ 14 сентября 2010

Прежде всего мне известен этот вопрос:

и, в частности, лучший ответ там: http://emilsblog.lerch.org/2009/07/javascript-hacks-using-xhr-to-load.html.

Итак, доступ к двоичным данным из Javascript с помощью Firefox (и более поздних версий Chrome, которые на самом деле тоже работают, не знаю об Opera).Все идет нормально.Но я все еще надеюсь найти способ доступа к двоичным данным с помощью современного IE (в идеале IE 6, но по крайней мере IE 7+), без использования VB.Было упомянуто, что XHR.messageBody не будет работать (если он содержит ноль байтов), но мне было интересно, если бы это могло быть решено с более новыми версиями;или если могут быть альтернативные настройки, которые позволят простой доступ к двоичным данным.

Конкретный вариант использования для меня - это доступ к данным, возвращаемым веб-службой, которая закодирована с использованием двоичного формата передачи данных (включая комбинации байтов, которыенедопустимы в кодировке UTF-8).

Ответы [ 4 ]

3 голосов
/ 26 апреля 2013

Это возможно с IE10, используя responseType = arraybuffer или blob. Тебе пришлось ждать всего несколько лет ...

http://msdn.microsoft.com/en-us/library/ie/br212474%28v=vs.94%29.aspx

http://msdn.microsoft.com/en-us/library/ie/hh673569%28v=vs.85%29.aspx

3 голосов
/ 14 сентября 2010

Хорошо, я нашел несколько интересных ссылок, хотя пока не совсем удачное решение.

Одна очевидная вещь, которую я пробовал, - играть с кодировками. Есть 2 очевидные вещи, которые действительно должны работать:

  • Latin-1 (он же ISO-8859-1): это однобайтовая кодировка, отображающая один-к-одному с Unicode. Таким образом, теоретически должно быть достаточно объявить тип содержимого "text / plain; charset = ISO-8859-1" и получить символ за байтом. Увы, из-за идиотской логики браузеров (и даже более идиотского мандата в HTML 5!) Происходит транскодирование, которое странным образом меняет диапазон символов высокого контроля (коды 128 - 159). По-видимому, это связано с обязательным предположением, что кодировка на самом деле - Windows-1252 (почему? По каким-то глупым причинам ... но это так и есть)
  • UCS-2 - это 2-байтовое кодирование фиксированной длины, предшествующее UTF-17; и просто разбивает 16-битные коды символов на 2 байта. Увы, браузеры, похоже, не поддерживают его.
  • Теоретически UTF-16 может работать, но есть проблема символов суррогатной пары (0xD800 - 0xDFFF), которые зарезервированы. И если включены пары байтов, которые кодируют эти символы, происходит повреждение.

Однако: похоже, что преобразование для Latin-1 может быть обратимым, и если так, держу пари, я все-таки смогу его использовать. Все мутации имеют размер от 1 байта (0x00 - 0xFF) до значений больше байта, и, по крайней мере, для Firefox нет двусмысленных отображений. Если это верно и для других браузеров, можно будет отобразить значения обратно и устранить вредные эффекты автоматического транскодирования. И тогда это будет работать для нескольких браузеров, включая IE (с оговоркой о необходимости чего-то особенного для работы с нулевыми значениями).

Наконец, некоторые полезные ссылки для преобразования типов данных:

2 голосов
/ 02 декабря 2010

Вы можете использовать объект JScript " VBArray ", чтобы получить эти байты в IE (без использования VBScript):

var data = new VBArray(xhr.responseBody).toArray();

1 голос
/ 17 сентября 2010

Я предполагаю, что ответ прост "нет", согласно этому сообщению: как получить доступ к XHR responseBody (для двоичных данных) из Javascript в IE?

(или: «использовать VBScript, чтобы помочь»)

...