AJAX и русские буквы — проблема с кодировкой.

При использовании AJAX, особенно совместно с MySQL, могут возникнуть проблемы с передачей русских букв между скриптами независимо от метода (GET или POST). Решением является:

  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

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

 

Оцените статью
Добавить комментарий

  1. virua

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

  2. WearyMax

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

  3. AlexHustas

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

  4. epictetus

    UTF-8 не спасет

  5. Ov4ina

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

  6. none

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

  7. unnamed

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

  8. anonymous

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

  9. Vasily

    respect

  10. neutrino

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

  11. popovich

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

  12. stroiceny.ru

    Спасибо быстрая реальная помощь респект

  13. Devastator

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

  14. drd0s

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

  15. Cookson

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

  16. Spazm

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

  17. SpaceMindX

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

  18. Игорь

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

  19. MadFly

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

  20. Салават

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

  21. Romash

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

  22. Jakis

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

  23. Андрей

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

  24. Отори

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

  25. dizelbox

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

  26. Vect0r

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

  27. Feskel

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

  28. Lyulyok

    Спасибо! header … charset=utf-8 и все заработало:-)

  29. Максим

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

  30. nikel

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

  31. FATALITY

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

  32. anonymous

    не помогло

  33. Samara

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

  34. Стас

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

  35. Артем

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

  36. wm

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

  37. a-potap

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

  38. int99h

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

  39. dag

    и чё и чё…

  40. Fiu

    Это все бред! Я такой то разработчик сайта Google с посещаемостью несколько миллионов хостов в день. Типа сейчас могу обосновать.

  41. Славик

    Спасибо, мне помогло.

  42. Макс

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

  43. КрисТиночка

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

  44. Дмитрий Иванович

    У меня лично проблема с приёмом от скрипта PHP переменных в JAVASCRIPT (в смысле если в переменной русские буквы) а от AVASCRIPT до 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>'; ?>

  45. Сергей

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

  46. ае

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

  47. Дима

    СПАСИБО!!!!

  48. Юрий

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

  49. Дмитрий

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

  50. Pavel

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

  51. Саня

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

  52. Шинкарев

    Коллеги, после долгих проб и ошибок, прикрутил на свой сайт (shinkareff.ru, работает под win-1251) форму комментариев от Disqus. Во всех браузерах (ФФ, Опера, Хром, Сафари), кроме ИЕ, работает нормально. В ИЕ ломается кодировка. Сам комментарий отображается нормально, а текст интерфейса — неверно. Помогите советом, примером или ссылкой.

  53. Тимур

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

  54. Asayhem

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

  55. ecolora

    Ответ однозначно не полный! Я предлагаю своё решение, в зависимости от кодировки сайта:

  56. Сергей

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

  57. fanat

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

  58. Рафаел

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

  59. CrashFox

    Была аналогичная проблема с кодировками. База изначально в 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); …

  60. Дима

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

  61. Ирина

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

  62. nalbuh.ru

    Кто нибудь решил проблему DISQUS на странице с кодировкой WIN1251?

  63. Антон

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

  64. Артем

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

  65. mici

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

  66. An

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

  67. minikent

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

  68. Phylocko

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

  69. Docx

    header("Content- type:text/html; charset=windows-1251"); помогает только не для оперы. В опере все такой же страшный код. Подскажите что делать?

  70. Crisitan

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

  71. Макар

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

  72. Serg

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

  73. Михаил

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

  74. Юрий

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

  75. Tuymurod

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

  76. Алекс

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

  77. Евгений

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

  78. Павел

    header(«Content-type: text/html; charset=windows-1251»);

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

  79. Дмитрий

    когда мучаешься что-нибудь получится. Установил OPERA и все, все получилось

  80. Дмитрий

    Большое спасибо! Коротко и понятно. Сразу помогло вставить на серверной части
    header(«Content-type: text/html; charset=windows-1251»);