просто о сложном


AJAX и русские буквы

tags: ajax, javascript

Две самые распространенные кодировки сайтов в рунете - UTF-8 и Windows-1251. И у той и у другой есть как плюсы, так и минусы. К примеру, UTF-8 использует для кодировки одного русского символа 2 байта против 1-го у win1251, что не только увеличивает размер хранимой информации, но и не позволяет пользоваться всеми стандартными функциями php для работы со строками, т.к. эти функции изначально являются однобайтными (для работы с мультибайтовыми кодировками служит специальное расширение, которое по умолчанию при установке PHP выключено Multibyte String Functions). В свою очередь Windows-1251 вызывает сложности при использовании AJAX'а, т.к. GET и POST по умолчанию передаются в UTF-8, и их придётся перекодировать на стороне сервера "вручную".

Если вы по каким-то причинам используете Windows-1251 (или другую не-UTF-8 кодировку), то при использовании AJAX вам могут помочь:

  1. явное указание кодировки
    на клиентской части это:
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
    на серверной (php):
    header("Content-type: text/html; charset=windows-1251");
  2. ручная перекодировка
    при отправке из javascript применять функцию encodeURIComponent, которая кодирует в Unicode
    req.send('param='+encodeURIComponent('привет мир'));
    в серверной части приводим к нужной кодировке с помощью iconv
    iconv('UTF-8', 'WINDOWS-1251', $param);

Также часто проблемы с кодировкой могут возникать из-за неверных настроек MySQL. В этом случае необходимо внести коррективы в файл my.cnf/my.ini (в зависимости от версии). В разделе [mysqld] должны быть строки:

default-character-set = cp1251
init-connect="SET NAMES cp1251"
skip-character-set-client-handshake=1

Последний параметр заставляет сервер игнорировать кодироку, посылаемую клиентом, и использовать указанную в настройках сервера.

Всем добра!

posted on january 24, 2008, updated on september 02, 2025

Комментарии

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

virua 18.03.2008 12:11 #

используйте кодировку UTF-8 и не будет проблем с русскими буквами :)

WearyMax 20.03.2008 16:39 #

header("Content-type: text/html; charset=windows-1251");
и все сразу заработала
БАЗИБА

AlexHustas 09.04.2008 16:32 #

UTF-8 не спасет

epictetus 25.06.2008 16:51 #

Очень помогло. Кликнул аж на три рекламы))

Ov4ina 18.08.2008 18:01 #

огромное спасибо (((-:
а то никак не мог победить, чтоб jquery post туда и обратно нормально гонял русские буквы (-:
Спасибо!

none 24.11.2008 15:47 #

И нифига оно не заработало, разборщик XML по прежнему натыкаясь на русские буквы спотыкается.

unnamed 16.12.2008 16:31 #

При charset=windows-1251:
IE, Opera - все нормально.
А вот Firefox, Safari и Google Chrome - ответ с сервера русскими буквами - нифига.
(На сервере linux)

anonymous 18.12.2008 12:17 #

respect

Vasily 23.12.2008 14:17 #

Чтобы XML не спотыкался на кирилице, первое что необходимо - генерировать его в UTF-8. А при перегонке в php или mysql юзать iconv. Выше написали как именно.

neutrino 12.01.2009 17:35 #

respect, чтобы отображались русские буквы и в случае проблемы с mysql можно в код php добавить:
mysql_query("SET NAMES cp1251"); // для mysql
header("Content-type: text/html; charset=windows-1251"); //для ajax

popovich 07.02.2009 17:50 #

Спасибо, статья очень помогла

Devastator 24.02.2009 16:25 #

Что делать при приеме данных закодированных с помощью escape и серверной части на PHP?!

drd0s 03.03.2009 16:23 #

Спасибо. $_GET['a'] в скрипте преобразовалась в кракозябры, помогло $a=iconv("utf-8", "cp1251", $_GET['a']);

Cookson 27.03.2009 21:36 #

Про header("Content-type: text/html; charset=windows-1251");
Узнал на другом форуме, но там нужно было регистрироваться, а я этого очень не люблю, поэтому не смог сказать спасибо. Говорю Это вам))) И отдельно за эту статью. Спасибо, помогло очень.

Spazm 02.04.2009 15:50 #

Спасибо! Очень приятно когда первая ссылка в поисковой выдаче решает проблему )

SpaceMindX 21.04.2009 15:03 #

Спасибо! Помогло!

Игорь 27.04.2009 02:09 #

Спс РЕБЯТА!
header("Content-type: text/html; charset=windows-1251"); и всё заработало :)

MadFly 28.04.2009 20:47 #

Спасибо большое)
иконв помогал для Ие, но рушил работу в мозилле. использование encodeURIComponent было то, что нужно!
хорошая и краткая статья. спасибо ещё раз!

Салават 02.08.2009 21:41 #

header("Content-type: text/html; charset=windows-1251");
помогло))
с аяксом вообще давно общаюсь) но блин иногда подкидывает "радость")

Romash 06.08.2009 11:29 #

Огромное спасибо!!! Долго мучился, все помогло!

Jakis 14.09.2009 17:48 #

Искал-искал по инету. Тут нашел. Спасибо, помогло :)

Андрей 13.11.2009 00:14 #

Благодарю, помогла волшебная команда header ... charset=utf-8 ;-)

Отори 17.11.2009 11:30 #

Реальная полезная статья. Премного благодарен.

dizelbox 19.11.2009 13:51 #

Спасибо огромное за пост. Искал ответ часа 3 (что для меня довольно долго, учитывая тематику). По рекламе поклацал;)

Vect0r 28.11.2009 09:08 #

И от меня спасибо! Помогло все в комплексе!
На рекламу покликал ;)

Feskel 03.12.2009 15:35 #

Отличная статья.
Очень помогло когда при переходе с IE на Firefox русские буковки пропали. Решилось через ручную кодировку строки и обратную кодировку на сервере

Максим 04.02.2010 02:25 #

JAVASCRIPT
var stroka=encodeURIComponent
PHP
iconv('UTF-8', 'cp1251//IGNORE', urldecode($stroka));
готовим строку для запрса к бд mySQL с кириллицей

nikel 10.04.2010 10:13 #

+5!
header("Content-type: text/html; charset=windows-1251");
помогло

FATALITY 20.04.2010 15:07 #

Помогло, спасибо!

Samara 19.08.2010 21:18 #

Всю жизнь парился с этими сраными кодировками, вечно непонятные символы появлялись, однако если нравится 1251 кодировка и используешь ajax, просто в серверных php файлах надо было всего одну строчку проставить
header("Content-type: text/html; charset=windows-1251");
СПАСИБО АВТОРУ ОГРОМНОЕ!!!!!!!!!!!!!!!!!!

Стас 20.08.2010 10:28 #

Помогло очень) спасибо... почему в инете нигде не встречал такого простого решения проблемы!!! спасибо !!!

Артем 11.09.2010 12:46 #

Обычно никогда не оставляю комментарии, даже в полезных статьях, но пожалуй сделаю это впервые))
Премного благодарен! :)

wm 28.09.2010 07:59 #

спасибо помогло на сервчасти iconv("UTF-8", "WINDOWS-1251", $param);

a-potap 27.10.2010 10:58 #

Не помогло... IE выдает нормально, а вот Chrome, FF и т.п. - мимо.
всё равно, спасибо за материал.

int99h 27.10.2010 14:03 #

Супер! Спасибо!

Макс 04.03.2011 17:57 #

Спасибо! Помогло!

КрисТиночка 03.04.2011 22:11 #

У меня лично проблема с приёмом от скрипта PHP переменных
в JAVASCRIPT (в смысле если в переменной русские буквы)
а от JAVASCRIPT до PHP русский шрифт проходит нормально
привожу код PHP
<?php
// результат отправляем в формате XML
header('Content-Type: text/xml');
// Генерировать заголовок XML
echo '<?xml version="1.0" encoding="windows-1251" standalone="yes"?>';
// Создать элемент <response>
echo '<response>';
// Получить имя пользователя
$name = $_GET['name'];
//Вывод сообщения (переменная name передаёт адэкватно если только латинские буквы в ней)
echo htmlentities($name) . ', текст что в этих скобках выводится адэкватно';
// закрыть элемент<response>
echo '</response>';
?>

Дмитрий Иванович 07.04.2011 00:38 #

спасибо. то что надо.

Сергей 13.04.2011 12:32 #

не помог ни один из способов, хотя читал о них и на других сайтах.
1й способ просто абсолютно ничего не поменял, а 2й способ в яваскрипте кодирует в утф-8, а в пхп обратно не преобразовывет, так и выводится %D1%8B%d0%d1 итд.

ае 22.04.2011 15:04 #

СПАСИБО!!!!

Дима 12.05.2011 12:09 #

Ничего не помогло... кодировка на сайте и в базе utf-8
передаю в ajax слово 'мама' в переменной, выводится %u043C%u0430%u043C%u0430, если кодировать принудительно переменную в utf-8 до передачи, то выводится %D0%BC%D0%B0%D0%BC%D0%B0. обратное кодирование процентики и оставляет(((

Юрий 25.05.2011 11:00 #

Спасибо большое. Коротко и ясно!

Дмитрий 30.05.2011 14:35 #

encodeURIComponent() вместо escape() помогло
Спасибо

Pavel 14.06.2011 16:07 #

Если бы все айтишники по делу писали, у таких ребят как я было бы больше время на телок, футбол и пиво) Спасибо!

Саня 25.07.2011 22:16 #

UTF-8 в топку, задрала эта кодировка, одни проблемы с ней!!!!!

Тимур 28.09.2011 18:40 #

header("Content-type: text/html; charset=windows-1251");
то что было нужно, спасибо! без этого слетало отображение данных из бд напрочь

Asayhem 11.10.2011 05:19 #

Самая полезная, лаконичная статья по этому вопросу среди всего "спама", который мне пришлось перечитать в сети

Сергей 24.11.2011 11:23 #

Мне это помогло iconv("UTF-8", "WINDOWS-1251", $param). Спасибо!

fanat 02.12.2011 23:58 #

Спасибо автору за помощь. Согласен со всем, кроме части касательно windows-1251. Указаные автором методы прекрасно работают и с utf-8. А второй пункт("Ручная перекодировка") не нужна вовсе.

Рафаел 04.12.2011 12:33 #

Была аналогичная проблема с кодировками.
База изначально в utf-8
По умолчанию кодировка для страниц со стороны сервера utf-8
Мне помогло следующее (на серверной стороне):
До:
...
$query = "select * from table";
$result = mysql_query($query);
...
После:
...
$query = "select * from table";
mysql_query('SET character_set_database = utf8');
mysql_query('SET NAMES utf8');
$result = mysql_query($query);
...

CrashFox 21.12.2011 10:31 #

Спасибо!
Установка в пхп хедера помогла)
header("Content-type: text/html; charset=windows-1251");

Дима 21.12.2011 15:41 #

Огромное спасибо CrashFox 21.12.11 10:31
Сделала точно так же и проблема ушла

Ирина 22.12.2011 09:45 #

реально статья помогла!Спасибо;)

Антон 26.04.2012 16:30 #

Если всё в UTF-8 (и сайт, и БД и пр.), но всё равно фигня, попробуйте добавить в .htaccess строчку:
AddDefaultCharset UTF-8
Поможет, если хостинг по умолчанию отдаёт в windows-1251

Артем 27.05.2012 23:37 #

$param=iconv("UTF-8", "WINDOWS-1251", $param);
большое спасибо :)

mici 08.06.2012 19:06 #

Браво !
Общими усилиями охватили все случаи!
Но уже какой век на дворе.
Можно ли сегодня оперировать кодировкой прошлого тысячелетия -1251 ?
И создавать самому себе проблемы...

An 11.06.2012 19:01 #

Смотрю, тут и так много похвал, но не могу удержаться от того, чтобы написать еще одну) Коротко, ясно, спасибствую)

minikent 16.07.2012 00:15 #

Спасибо огромное! Я с этим разобрался, метод позволил решить поставленную задачу. Приятно, что есть люди, которые делятся знаниями.

Phylocko 19.07.2012 17:32 #

Спасибо!!! Очень помогло!!!

Crisitan 02.09.2012 20:44 #

Ребята подскажите что делать! В AJAX вообще не шарю, в PHP совсем чуть чуть. Проблема та же самая. Кодировка у меня на всех страницах стоит UTF8, кодировка базы в PHPMyAdmin utf8_general_ci, использую метод serialaize() Jquery. перепробовал все что здесь написано, все равно в базу добавляются каракули!
Спасибо!

Макар 31.01.2013 21:58 #

Спасибо! Все четко! Помогло!

Serg 26.02.2013 15:21 #

Огромное спасибо! iconv помог

Михаил 30.04.2013 00:03 #

Столько похвал, здорово. У меня проблема: сайт UTF-8, БД 1251, не могу русские буквы с формы в сайте в БД записать, каракули.

Юрий 25.02.2014 11:53 #

Спасибо, помогла!

Tuymurod 17.07.2014 08:37 #

Ничего не помогало. Только это спасло:
mysql_query('SET character_set_database = utf8');
mysql_query('SET NAMES utf8');
Спасибо!

Алекс 09.01.2015 18:29 #

Сразу помогло <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />. Проверял в Google Chrom. Огромное спасибо!

Евгений 24.03.2015 16:49 #
Отправка новых комментариев временно отключена. Извините, работаем над этим.


tags cloud