Непонятный баг с 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) № 1
Ну так-то всё верно, согласно 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- … r-sets.xml ) нет такого charset'а (cp1251).

А вообще, я очень удивлён, что на дворе 2013 год, а ваши прогеры до сих пор не осилили utf-8.
Евгений Степанищев (bolknote.ru) автор № 2
А вообще, я очень удивлён, что на дворе 2013 год, а ваши прогеры до сих пор не осилили utf-8.

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

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

Мохов Олег (o-mokhov.ya.ru) № 5
А ты точно об 8-м экплорере говоришь? А то скриншот похож на windows 8, где оно уже нет, кажется.
vladon (vladon.ru) № 7

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

А почему медленнее-то?
Из достоинств: ну может не японские иероглифы, но букв татарского алфавита в windows-1251 тоже нет. :-)
Евгений Степанищев (bolknote.ru) автор № 8

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

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

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

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

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

vladon (vladon.ru) № 9

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

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

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

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

> но букв татарского алфавита в windows-1251 тоже нет. :-)
В нашем продукте и это без надобности.

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

Евгений Степанищев (bolknote.ru) автор № 10

Комментарий для 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 … D%D0%94%29
http://www.cnews.ru/top/2012/04/16/moskva_ … aka_485865

vladon (vladon.ru) № 11
ну по 1му абзацу я вообще ступил :-)
по второму: а что если, например, казахи заинтересуются вашими продуктами?
Евгений Степанищев (bolknote.ru) автор № 12

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

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

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

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

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

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

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

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