AJAX и кириллица

11.10.2010
У многих программистов (и у меня в частности), при знакомстве с "аяксом" может появится вопрос - "Как же правильно отправить на сервер запрос, содержащий знаки кириллицы?".

Отправляем


На самом деле всё довольно таки просто, ко всем (или только к необходимым) переменным перед отправкой надо применить функцию encodeURIComponent(). Эта функция переводит в UTF-8-кодировку все символы, кроме символов латинского алфавита и десятичных цифр.
Вот пример такой функции, отправляющей AJAX запрос к файлу ajax/file.php
function UpdateBlocks(obj)

{
var req;
req = newXMLHttp();
if (req) {
req.onreadystatechange = function()
{
if (req.readyState == 4 && req.status == 200)
{
respone = req.responseText;
obj.innerHTML = respone + obj.innerHTML;
}
};
req.open('POST', 'ajax/file.php', true);
req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=windows-1251');
req.send('blockid=' + encodeURIComponent(id) + '&Check=' + encodeURIComponent(i));
}
else
alert('Браузер не поддерживает AJAX');
}

Как видите в 16 строчке, переменные blockid и Check кодируются с помощью указанной выше функции.

Принимаем


При этом, в самом "ajax/file.php" при приёме переменных blockid и Check, их надо обратно из UTF-8 перевести в кодировку cp1251, теперь уже с помощью PHP функции iconv().
$blockid = iconv('UTF-8', 'windows-1251', $_POST['blockid']);

$Check = iconv('UTF-8', 'windows-1251', $_POST['Check'));

Вот и всё, а дальше уже можно обрабатывать эти данные как душе угодно.

И на последок о ещё одном полезном свойстве функции encodeURIComponent(). Если в качестве значения переменной id передать "12&text=15", то в итоге мы будем иметь не одну переменную id равной 12&text=15, а две, и это:
id=12 и text=15. А с использованием функции названой выше, такой проблемы не будет и данные сохранятся в целости и сохранности.