<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Чудо{вищные} заметки &#187; ajax</title>
	<atom:link href="http://miracle.rpz.name/tag/ajax/feed/" rel="self" type="application/rss+xml" />
	<link>http://miracle.rpz.name</link>
	<description>Sorry for my terrible english. My native language is PHP.</description>
	<lastBuildDate>Thu, 12 Jan 2012 20:42:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4-alpha-19719</generator>
		<item>
		<title>AJAX и проблемы с кодировкой</title>
		<link>http://miracle.rpz.name/2008/11/28/ajax-charset/</link>
		<comments>http://miracle.rpz.name/2008/11/28/ajax-charset/#comments</comments>
		<pubDate>Fri, 28 Nov 2008 10:50:30 +0000</pubDate>
		<dc:creator>MiRacLe</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[charset]]></category>

		<guid isPermaLink="false">http://miracle.rpz.name/?p=162</guid>
		<description><![CDATA[Вот уже полтора года в draft-ах пылился пост о надуманности проблем с кодировками и т.н. AJAX-ом. Каждый раз, когда на форумах всплывали вопросы подобного характера, хотелось дать ссылку, на всякий всплеск заходов на блог по запросам &#8220;кодировка, ajax, проблема&#8221; хотелось его опубликовать, но мне казалось, что пост ещё не закончен, надо ещё чуть-чуть дописать&#8230; Но [...]]]></description>
			<content:encoded><![CDATA[<p>Вот уже полтора года в draft-ах пылился пост о надуманности проблем с кодировками и т.н. AJAX-ом.<br />
Каждый раз, когда на форумах всплывали вопросы подобного характера, хотелось дать ссылку, на всякий всплеск заходов на блог по запросам &#8220;кодировка, ajax, проблема&#8221; хотелось его опубликовать, но мне казалось, что пост ещё не закончен, надо ещё чуть-чуть дописать&#8230;<br />
Но вот буквально сегодня появился удивительно похожий пост &#8211; <a href="http://blog.fxposter.org/2008/11/28/jquery-ajax-and-cp1251/">ajax, cp1251</a>. Похожий по содержанию, но совершенно противоположный по смыслу.<br />
Посему свой черновичок я решил удалить, а поведать свою &#8220;истину&#8221; в форме критики совета fxposter-а.</p>
<blockquote><p>Ни для кого ни секрет, что кодировкой получаемых через Ajax данных по-умолчанию принимается UTF-8.</p></blockquote>
<p>На самом деле это секрет. Для многих секрет. И многие не понимают почему это так.<br />
Внутреннее представление строк (и регулярных выражений) в JavaScript для всех не-ASCII последовательностей как раз UTF-8.<br />
Отсюда и проистекает т.н. &#8220;проблема&#8221; &#8211; если кодировка не указана явно и используется нелатиница, она будет интерпретирована как utf-8 последовательность.</p>
<blockquote><p><b>Update 29.11</b> Свежий воздух и Давид Мзареулян остудили пыл, поэтому спешу уточнить о чём именно будет идти речь ниже.<br />
Итак &#8211; у вас есть некий ресурс в однобайтовой кодировке (к гадалке не ходи это будет windows-1251) и вы озаботились освоить новый buzzword по имени AJAX. Немного почитав, вы делаете первые робкие шаги в этом направлении и тут же наступаете на &#8220;детские грабли&#8221;, а затем, немного отдышавшись, мчитесь на форумы с криком о помощи. И вам эту помощь окажут &#8211; переделай мол, свой ресурс на utf-8&#8230; Конечно-конечно скажете вы и пойдёте переделывать&#8230;<br />
Я же хочу остеречь от таких опрометчивых шагов.
</p></blockquote>
<p>Cтандартное решение, которое наперебой советуют все &#8211; &#8220;используй utf-8 и нет проблем&#8221;.</p>
<p>И советчики правы &#8211; проблем действительно не будет.</p>
<p>Просто трафик увеличится &#8220;вдвое&#8221;. Те же данные, тот же результат, а трафика &#8220;в два раза&#8221; больше. Ага?</p>
<p><span style="text-decoration: line-through;">Что вы там говорите насчёт порошка?!?</span></p>
<p>Если вам этот фактор кажется мало***щим, то на этом чтение надо прекратить и начать переделывать свой проект на использование UTF-X,<br />
остальным же оставлю несколько рецептов, которые помогут избежать проблем при использовании однобайтовых кодировок в т.н. AJAX-приложениях: <span id="more-162"></span></p>
<ul>
<li>Первое, оно же главное &#8211; ВСЕГДА указывайте кодировку контента. В любом ответе сервера с текстовым контентом обязан быть заголовок <i>Content-Type: your/type; charset=your-charset</i>.<br />
Дешевле всего это сделать, настроив сервер (например в php через <a href="http://ru2.php.net/manual/en/ini.core.php#ini.default-charset">default_charset</a>)</li>
<li>Указывайте charset при включении javascript в тело документа (&lt;script type=&quot;text/javascript&quot; charset=&quot;your-charset&quot;&gt; )</li>
<li>Указывайте ПРАВИЛЬНЫЙ charset<br />
<blockquote><p>предварительно установив соответствующий заголовок &#8211; &#8220;Content-Type: text/html; charset=cp1251&#8243;</p></blockquote>
<p>В данном <span style="text-decoration: line-through;">конкретном</span> <span style="text-decoration: line-through;">взятом за жопу</span> случае fxposter сам себе злобный буратина.</p>
<blockquote><p>Any registered <a href="http://www.iana.org/assignments/character-sets">IANA charset</a> may be used, but UTF-8 is preferred.</p></blockquote>
<p>Ну нету среди any registered кодировки с названием cp1251&#8230;</li>
</ul>
<p>Для полноты картины приведу пару проблемных моментов, с которыми столкнуться прийдётся:</p>
<ul>
<li>Не позволяйте AJAX-ответам, которые содержат &#8220;нелатиницу&#8221; оставаться в кеше браузера (при 304 Not Modified ответ поднимется из кеша, но в качестве charset &#8220;некоторые браузеры&#8221; используют utf-8)</li>
<li>
<blockquote><p><a href="http://www.ietf.org/rfc/rfc4627.txt">JSON text SHALL be encoded in Unicode</a>.  The default encoding is UTF-8.</p></blockquote>
<p>Этим правилом НАГЛО пользуются производители различных библиотек для json_[en|de]code, но браузерам (как мы выяснили ранее) главное кодировку указать, а там всё разрулится.<br />
Отсюда и &#8220;проблема&#8221; &#8211; кодировать данные в JSON нужно вручную, распространнёные библиотечные функции на входе ожидают utf-8.</li>
</ul>
<p>Мораль сей басни я жду от вас в комментариях.</p>
]]></content:encoded>
			<wfw:commentRss>http://miracle.rpz.name/2008/11/28/ajax-charset/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Cross Domain XMLHttpRequest</title>
		<link>http://miracle.rpz.name/2008/10/03/crossdomain-xhr-with-flash/</link>
		<comments>http://miracle.rpz.name/2008/10/03/crossdomain-xhr-with-flash/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 21:50:52 +0000</pubDate>
		<dc:creator>MiRacLe</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[js]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[flash]]></category>

		<guid isPermaLink="false">http://miracle.rpz.name/?p=116</guid>
		<description><![CDATA[Задачи обмена информацией ставятся и успешно решаются каждый день. Но обмениваться можно по-разному. Кто-то дарит удобоваримый доступ к своей базе посредством распространённых обменных форматов (xml, csv, json, lisiy_chert), кто-то реализует собственные API, а кто-то идёт другими путями. Моя задача состояла в следующем &#8211; на ресурсах-сателитах необходимо разместить сложную форму. &#8220;Сложность&#8221; формы заключается в том, что [...]]]></description>
			<content:encoded><![CDATA[<p>Задачи обмена информацией ставятся и успешно решаются каждый день. Но обмениваться можно по-разному. Кто-то дарит удобоваримый доступ к своей базе посредством распространённых обменных форматов (xml, csv, json, lisiy_chert), кто-то реализует собственные API, а кто-то идёт другими путями.</p>
<p>Моя задача состояла в следующем &#8211; на ресурсах-сателитах необходимо разместить сложную форму. &#8220;Сложность&#8221; формы заключается в том, что данные подгружаются с главного ресурса и не могут быть загружены единовременно(при загрузке ресурса) или доставлены на ресурс-сателит заранее (так-так данных очень много и они достаточно быстро устаревают). Всевозможные API для доступа к информации основного ресурса в настоящий момент разрабатывать нецелесообразно, поэтому было решено для сателитов предоставлять некий готовый комплекс (аля plug-n-play).</p>
<blockquote><p>
Ещё до начала разработки я тщательно изучил уже имеющиеся механизмы для межсайтового обмена данными. Первым и самым перспективным был вариант использования flash-плеера, но единственный вменяемый пример <a href="http://blog.monstuff.com/archives/000294.html">FlashXmlHttpRequest</a> был только лишь примером, а не законченным куском кода, которым бы можно было воспользоваться. <a href="http://jquery.com/">jQuery</a> на тот момент даже не содержала функции $.getScript,  <a href="http://dklab.ru/lib/JsHttpRequest/">JSHttpRequest</a> с созданием тега script удачно справлялся, но POST по понятным причинам делать не мог.
</p></blockquote>
<p>Данные с главного ресурса могут подгружатся  посредством динамического создания тега script <a href="http://docs.jquery.com/Ajax/jQuery.getScript">jQuery.getScript</a>, с этим казалось бы проблемы нет. Но! Но последним шагом в указанной форме нужно отправить на основной сервер внушительный объём данных, которые могут не влезть в GET (тоже кстати говоря весьма интересный вопрос &#8211; а каково ограничение на длину URL в разных браузерах? в различных веб-серверах,прокси и фильтрах? &#8211; в <a href="http://www.ietf.org/rfc/rfc2616.txt">RFC2616</a> об этом не сказано). Можно конечно изобрести какие-либо механизмы, например отправлять данные небольшими порциями GET-ом, но скорости такая схема явно не прибавит, поэтому такие варианты оставлены другим изобретателям.<br />
<span id="more-116"></span></p>
<p>В первом рабочем варианте проблема решалась php-скриптом на сервере-сателите, через который данные POST-ом прокачивались на головной сайт. Но такая схема имела ряд недостатков, основным из которых опять же является скорость работы и дополнительное требование к ПО на сервере (наличие PHP) или требование к нам, разработчикам &#8211; создать прокси-скрипт для других распространнёных серверных платформ. </p>
<p><strike>И вот относительно недавно</strike> я наткнулся на занимательную библиотеку <a href="http://flxhr.flensed.com/">flxhr</a>. Автор довёл до конца идею и наваял интерфейс, который может <b>прозрачно заменять XMLHttpRequest</b> используя flash. Использовать flxhr легко и просто &#8211; <a href="http://flxhr.flensed.com/code/tests/flxhr-7f.html">заменяете стандартный XMLHTTPRequest</a> и дальше всё почти как обычно. </p>
<p>В дополнение ко всему, флеш-плеер решает ещё одно требование к разрабатываемому проекту &#8211; необходимо пресечь бесконтрольное распространение клиентского модуля(который устанавливается на сайт-сателит). Дело в том что в флеш-плеер от рождения встроен механизм контроля над внешними данными. Ранее это был ресурс crossdomain.xml в корне веб-сервера, содержащего скачиваемые данные. В нём описывалось откуда и что можно скачать. В новом плеере (а для использования flxhr необходим плеер версии не ниже 9.0.0.124) появился более удобный механизм &#8211; можно указать путь к ресурсу с политиками <a href="http://www.adobe.com/devnet/flashplayer/articles/fplayer9_security.html#goal_control">policyURL</a>.</p>
<blockquote><p>
 Кстати о версии плеера:  автор flxhr предусмотрел не только проверку версии плеера, но и возможность его апгрейдить не отходя от кассы (тот самый <a href="http://blog.deconcept.com/swfobject/#expressinstall">expressinstall из swfobject</a>).
</p></blockquote>
<p> Думаю стоит ещё раз упомянуть тот факт, что данная схема <b>не позволит</b> обратиться js-скрипту с произвольного сайта A на произвольный ресурс B без согласия его владельца. &#8220;Согласие&#8221;  выражается в виде правил, описываемых в файле crossdomain.xml(или указанным в loadPolicyFile), который располагается на сервере B. Другими словами данные, которые вы желаете публиковать, не должны быть &#8220;ворованными&#8221;.</p>
<p> Единственным неудобством, с которым пока довелось столкнуться в ходе обкатки flxhr, является тот факт, что данные в кодировке отличной от UTF-8 безвозвратно портятся. В остальном это самый <b>лёгкий и удобный</b> способ обмениваться данными между разными доменами уже <b>сейчас</b>, не дожидаясь появления сверхновых версий браузеров, в которых реализуют <a href="http://dev.w3.org/2006/webapi/XMLHttpRequest-2/">XMLHttpRequest Level 2</a>, и скоропостижной смерти всех старых.</p>
]]></content:encoded>
			<wfw:commentRss>http://miracle.rpz.name/2008/10/03/crossdomain-xhr-with-flash/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

<!-- Served from: miracle.rpz.name @ 2012-02-06 18:00:21 by W3 Total Cache -->
