Пишу, по большей части, про историю, свою жизнь и немного про программирование.

Непонятный баг с AJAX в IE8

В процессе переезда одного из наших проектов на новый сервер, Интернет Эксплорер восьмой версии стал выдавать какие-то невнятные ошибки при использования AJAX. К решению проблемы подключили меня, так как сообщение об ошибке совершенно не давало ключа к её исправлению:

Ошибка в IE (3.55КиБ)

В этом месте в коде не было ничего криминального, создание объекта для «аякса», асинхронная посылка запроса и проверка свойств того что пришло. Методом проб и ошибок удалось выяснить, что ошибка возникает при попытке обращения к свойствам «status» и «responseText» (а так же «responseXML», в коде он не использовался, но я просто попробовал).

Промучавшись с полчаса, я догадался переключить IE на работу с объектом ActiveX Microsoft.XMLHTTP, вместо XMLHttpRequest, у первого диагностика получше — ему всё-таки много лет, а XMLHttpRequest в восьмой версии браузера тогда ещё не обкатался.

На этот раз я получил нумерную ошибку (скриншота не сохранилось), по номеру которой я нашёл сообщение на сайте Микрософт, что ошибка связана с неверной кодировкой, пришедшей со стороны сервера. В «Хроме» посмотрел кодировку — оказалось, что кодировка с сервера приходит как «cp1251»:

Кодировка cp1251 (1.55КиБ)

Интернет Эксплорер такую кодировку не понял, один из админов вписал её руками, поскольку при смене версии ПХП заменили сервер FastCGI на php-fpm, стоило сменить эту кодировку на «windows-1251» как всё заработало.

Видимо, встретив странную кодировку, IE не смог понять как ему читать то, что пришло, он вообще не заполнил некоторые свойства, а объект, попытавшись получить к ним доступ, не понимал в чём дело и выдавал пустую ошибку, которая и символизировала это «я не понял что произошло».

16 комментариев
vladon (vladon.ru) 2013

Ну так-то всё верно, согласно RFC 2854:

charset
         The optional parameter «charset» refers to the character
         encoding used to represent the HTML document as a sequence of
         bytes. Any registered IANA charset may be used [...]

Среди зарегистрированных IANA ( http://www.iana.org/assignments/character-sets/character-sets.xml ) нет такого charset’а (cp1251).

А вообще, я очень удивлён, что на дворе 2013 год, а ваши прогеры до сих пор не осилили utf-8.

Евгений Степанищев (bolknote.ru) 2013

Комментарий для vladon.ru:

А вообще, я очень удивлён, что на дворе 2013 год, а ваши прогеры до сих пор не осилили utf-8.

Посмотрите, для интереса, в какой кодировке «Мой круг» ( http://moikrug.ru )

В чём преимущество перевода нашего продукта на UTF-8? Недостатки я знаю — медленнее всё станет.

PastorGL 2013

Комментарий для Евгения Степанищева:

Надо же. Однако, японцы для МойКруга — не целевая аудитория :)

Евгений Степанищев (bolknote.ru) 2013

Комментарий для PastorGL:

Для нас — тоже :)

Мохов Олег (o-mokhov.ya.ru) 2013

А ты точно об 8-м экплорере говоришь? А то скриншот похож на windows 8, где оно уже нет, кажется.

Евгений Степанищев (bolknote.ru) 2013

Комментарий для o-mokhov.ya.ru:

Скриншот точно Виндоуз 8, в которой запущен ИЕТестер ( http://www.my-debugbar.com/wiki/IETester/HomePage ), в котором я и искал в чём баг. А найден баг был в «оригинальном» IE8 под Windows XP.

vladon (vladon.ru) 2013

Комментарий для Евгения Степанищева:

А почему медленнее-то?
Из достоинств: ну может не японские иероглифы, но букв татарского алфавита в windows-1251 тоже нет. :-)

Евгений Степанищев (bolknote.ru) 2013

Комментарий для vladon.ru:

А почему медленнее-то?

Операции подсчёта длины строки, регулярные выражения, substr и прочие подобные гораздо медленнее, потому что в UTF-8 размер одного символа в байтах варьируется от 1 до 6 байт, а однобайтных строках мне чтобы адресоваться на энтый символ, достаточно адресоваться на энтый байт.

но букв татарского алфавита в windows-1251 тоже нет. :-)

В нашем продукте и это без надобности.

vladon (vladon.ru) 2013

Комментарий для Евгения Степанищева:

А почему медленнее-то?

Операции подсчёта длины строки, регулярные выражения, substr и прочие подобные гораздо медленнее, потому что в UTF-8 размер одного символа в байтах варьируется от 1 до 6 байт, а однобайтных строках мне чтобы адресоваться на энтый символ, достаточно адресоваться на энтый байт.

Ну можно внутри хранить всё в 1-байтовой кодировке, а выводить, конвертируя в utf-8.

Но в принципе, если необходимости расширяться на более другие языки нет, то действительно незачем.

но букв татарского алфавита в windows-1251 тоже нет. :-)

В нашем продукте и это без надобности.

А разве вы не делаете документооборот для Татарстана? Я даже помню ваша девочка писала, что для Татнефти и правительства РТ.

Евгений Степанищев (bolknote.ru) 2013

Комментарий для vladon.ru:

Ну можно внутри хранить всё в 1-байтовой кодировке, а выводить, конвертируя в utf-8.

Однобайтовая кодировка — это всего 256 значений. А UTF-8 — это горааааздо больше значений, мне сейчас лень считать сколько, но очевидно же, что в 256 значениях нельзя хранить любое бо́льшие число, так что в чём суть предложения-то?

А разве вы не делаете документооборот для Татарстана? Я даже помню ваша девочка писала, что для Татнефти и правительства РТ.

То, что он у нас в Татарстане используется не говорит о том, что это «документооборот для Татарстана». Например:

http://gov.tuva.ru/news.aspx?id=9221
http://www.tadviser.ru/index.php/%D0%9F%D1%80%D0%BE%D0%B5%D0%BA%D1%82:%D0%90%D0%B4%D0%BC%D0%B8%D0%BD%D0%B8%D1%81%D1%82%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%9F%D1%80%D0%B8%D0%BC%D0%BE%D1%80%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%BA%D1%80%D0%B0%D1%8F_%28%D0%9F%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0_%D0%A1%D0%AD%D0%94%29
http://www.cnews.ru/top/2012/04/16/moskva_likvidiruet_sed_luzhkova_25_tys_chinovnikov_otpravlyayut_v_oblaka_485865

vladon (vladon.ru) 2013

ну по 1му абзацу я вообще ступил :-)
по второму: а что если, например, казахи заинтересуются вашими продуктами?

Евгений Степанищев (bolknote.ru) 2013

Комментарий для vladon.ru:

По второму: а что если, например, казахи заинтересуются вашими продуктами

Я не имею права комментировать планы и стратегии компании.

vladon (vladon.ru) 2013

ой да ладно уж, если остаетесь на моноязычной кодировке, то очевидно, что планов нет...

gogis 2013

В чём преимущество перевода нашего продукта на UTF-8? Недостатки я знаю — медленнее всё станет.

А потом прибегает задыхающийся пм и изречет — «нам нужна интернационализация!!1».
Очень смешно, на imdb.com стали переводить названия тайтлов по геопризнаку, а вот поискать ничего не выйдет, потому что у них сайт на ISO.

Почти всегда сейчас выгодней начинать сразу на utf-8. Железо дешевеет и становится круче, а зарплата программистам только растет :)

Евгений Степанищев (bolknote.ru) 2013

Комментарий для gogis:

А потом прибегает задыхающийся пм и изречет — «нам нужна интернационализация!!1»… Почти всегда сейчас выгодней начинать сразу на utf-8.

У нас, знаете ли, коммерческая организация. Есть цель, есть бюджет, делаем. Именно в таком порядке.

alshur 2013

Комментарий для Евгения Степанищева:

Ещё в шестёрке была аяксовая проблема с кодировкой: http://htmlcssjs.ru/JavaScript/?30