Начиная свой первый большой проект Лагерь, я впервые познакомился с технологией AJAX. Наверно, все знают, что передача данных через javascript происходит (по крайней мере, в моем опыте) в кодировке UTF-8. Чтобы нормально принять эти данные в своем скрипте (например, на PHP), нужно их конвертировать в Win-1251 (если только изначально вы не пишете весь сайт в UTF-8 и база данных у вас тоже в UTF-8).
Это легко делается командой iconv («UTF-8», «windows-1251», $данные);. Обратное конвертирование нужно сделать при передаче данных из скрипта (на PHP) в javascript.
До поры до времени у меня все работало. Однако, внезапно уже на сайте Веб-критик этот метод благополучно загнулся. Не знаю по какой причине. Пришлось искать другой способ передачи данных.
И я его нашел.
Полазив по форумам и перебрав множество решений, отобрал одно стабильно работающее. Итак, вот краткий принцип передачи и приема данных с помощью AJAX:
1. Все данные (кроме цифр), передаваемые из javascript, нужно «экранировать» функцией escape. Например, escape ('данные для скрипта')
2. В принимающем скрипте (на PHP) эти данные нужно декодировать следующей функцией:
function unicodeUrlDecode($url, $encoding = "")
{
$encoding = 'CP1251';
preg_match_all('/%u([[:xdigit:]]{4})/', $url, $a);
foreach ($a[1] as $unicode)
{
$num = hexdec($unicode);
$str = '';// UTF-16(32) number to UTF-8 string
if ($num < 0x80)
$str = chr($num);
else if ($num < 0x800)
$str = chr(0xc0 | (($num & 0x7c0) >> 6)) .
chr(0x80 | ($num & 0x3f));
else if ($num < 0x10000)
$str = chr(0xe0 | (($num & 0xf000) >> 12)) .
chr(0x80 | (($num & 0xfc0) >> 6)) .
chr(0x80 | ($num & 0x3f));
else
$str = chr(0xf0 | (($num & 0x1c0000) >> 18)) .
chr(0x80 | (($num & 0x3f000) >> 12)) .
chr(0x80 | (($num & 0xfc0) >> 6)) .
chr(0x80 | ($num & 0x3f));
$str = iconv («UTF-8», «$encoding», $str);
$url = str_replace ('%u'.$unicode, $str, $url);
}
return urldecode ($url);
}
Если Вам эти данные нужно записать в базу данных, воспользуйтесь дополнительно такой функцией:
function prepare_message($message)
{
$message = trim($message);
$message = htmlspecialchars($message, ENT_QUOTES);
return $message;
}
3. Ответ скрипта нужно передавать, используя функцию ajaxout:
//Подготавливает строку для передачи браузеру
function ajaxout($content)
{
return unhtmlentities(htmlentities($content,0,"windows-1251"));
}function unhtmlentities ($string)
{
$trans_tbl = get_html_translation_table (HTML_ENTITIES);
$trans_tbl = array_flip ($trans_tbl);
return strtr ($string, $trans_tbl);
}
На этом всё.
Постовой: