Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с кодировкой в jQuery
 
 автор: Trivium   (09.09.2014 в 23:49)   письмо автору
 
 

Всем привет.
Пробую передать кириллическую строку через jQuery, но на сервак приходят крокозябры вида: АБВГД.
Код страницы:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>MEGA TITLE</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<script language="javascript" src="jquery-compressed.js"></script>
<script>
$(document).ready(function()
{
    $.get("ajax.php?w=АБВГД", {v: encodeURIComponent("АБВГД")});
});
</script>
</head>

<body></body>
</html>

Пробовал всё сохранять в UTF-8, Windows-1251, ставить кодировку через PHP header, отправлять строку через адрес, через параметры в jQuery, раскодировать, перекодировать, через urldecode и никаким способом никогда строки нормально не приходят. При чём на одном сайте это работает нормально, а на другой заливаю и там нет. Может быть с хостингом что-то? Но хостеры пишут, что у них всё нормально. Что может быть не так? А то перепробовал уже кажется всё, что можно было

  Ответить  
 
 автор: psychomc   (10.09.2014 в 00:00)   письмо автору
 
   для: Trivium   (09.09.2014 в 23:49)
 


<meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> 

зачем это? параметры передаёте неправильно, в jquery есть штатные средства для этого, не нужно самому ничего кодировать

  Ответить  
 
 автор: Trivium   (10.09.2014 в 00:09)   письмо автору
 
   для: psychomc   (10.09.2014 в 00:00)
 

Так я ж говорю пробовал и в UTF-8 сохранять всё и её ставить кодировкой и без кодировки. И декодить на серваке через iconv, но глюк где-то то ли в jQuery происходит, то ли при передаче на сервак.

  Ответить  
 
 автор: confirm   (10.09.2014 в 00:23)   письмо автору
 
   для: Trivium   (10.09.2014 в 00:09)
 

Не городите чуши, jQuery ни в чем перед вами не виновен. Все работает без проблем на Ajax хоть в этой библиотеке, хоть без нее с кодировкой 1251, если только самому не накосячить.
Если вы делаете правильно: клиент в 1251 -> серверу с по умолчанием 1251 -> получает utf -> iconv в 1251, и все работает.

  Ответить  
 
 автор: Trivium   (10.09.2014 в 00:30)   письмо автору
 
   для: confirm   (10.09.2014 в 00:23)
 

Я ж сказал на одном серваке работает нормально, читать надо внимательнее, а на другом нет.. Всё точно так же. Залил на один - работает, на другой - не работает.

  Ответить  
 
 автор: confirm   (10.09.2014 в 00:55)   письмо автору
 
   для: Trivium   (10.09.2014 в 00:30)
 

Вот - клиент в 1251 -> серверу с по умолчанием 1251 -> получает utf -> iconv в 1251, и все работает.

Все. Более ничего не надо. А вообще, не лучше ли перейти на utf? Конечно любого будет давить жаба на лишние расходы в базе, но все таки с этим недостатком одновременно получите и большой выигрыш.

  Ответить  
 
 автор: Trivium   (10.09.2014 в 01:02)   письмо автору
 
   для: confirm   (10.09.2014 в 00:55)
 

Ну так я же говорю пробовал и utf8 и 1251. Но ни так, ни так не работает. И iconv тоже. Ни через get ни через post ни через передачу по адресу. Собрался переводить весь сайт в utf, начал тестить и ничего не работает. На другом серваке с 1251 работает. Вот я и думаю может с кодировками в апаче трабблы.

  Ответить  
 
 автор: confirm   (10.09.2014 в 02:00)   письмо автору
 
   для: Trivium   (10.09.2014 в 01:02)
 

Вот простой пример, сервер при этом имеет настройки:
ответы:
без указания кодировки text/html
с указанием кодировки text/html; charset=utf-8
(рекомендуемое) - не задано //установлено

работаем в 1251:
<?
if($_POST) {
    
//сервер не передает кодировку по умолчанию, передаем ее сами, 
    //хотя можете настроить сервер по умолчанию на 1251, на прием это не повлияет
    
header('Content-type: text/html; charset=windows-1251'); 
    echo 
'Вы передали '.iconv('utf-8','windows-1251',$_POST['as']);
    exit;
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<style>

</style>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
$(function() {
    $('form').submit(function() {
        $.post(location, $(this).serialize(), function(d) {
            alert(d); 
        });
        return false;
    });
});
</script>    
</head>

<body>
<form>
<input name="as" value="Мама" />
<button>Отправить</button>
</form>
</body>
</html>


И проблем нет. Если и у вас этот пример будет работать, то ваша проблема не в кодировке, а в битых данных, а об этом уже писалось.

  Ответить  
 
 автор: confirm   (10.09.2014 в 00:01)   письмо автору
 
   для: Trivium   (09.09.2014 в 23:49)
 

Вы не то пробуете. Это не проблема jQuery, собственно и проблемы ни какой нет, а есть тот факт, что Ajax работает только в кодировке UTF, поэтому ваш 1251 с клиента передается серверу в utf. А для того чтобы получить из него на сервере 1251 нужна функция не urldecode, а iconv().

  Ответить  
 
 автор: Trivium   (10.09.2014 в 00:20)   письмо автору
 
   для: confirm   (10.09.2014 в 00:01)
 

Ну вот так пробую и то же самое:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>MEGA TITLE</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script language="javascript" src="jquery-compressed.js"></script>
<script>
$(document).ready(function()
{
    $.post("ajax.php?w=АБВГД", {v: "АБВГД"});
});
</script>
</head>

<body></body>
</html>

  Ответить  
 
 автор: confirm   (10.09.2014 в 00:24)   письмо автору
 
   для: Trivium   (10.09.2014 в 00:20)
 

А как вы думаете - ajax.php?w=АБВГД - это что такое?

  Ответить  
 
 автор: Trivium   (10.09.2014 в 00:29)   письмо автору
 
   для: confirm   (10.09.2014 в 00:24)
 

И что же?

  Ответить  
 
 автор: confirm   (10.09.2014 в 00:51)   письмо автору
 
   для: Trivium   (10.09.2014 в 00:29)
 

Уважаемый, это не бредни, это вы обязаны знать, что данные передаваемые формой браузер должным образом обработает, но если вы сами подставляете такие данные в url на стороне клиента, то вот здесь как раз и нужен механизм url кодирования, в противном случае на сервере вы можете получить совсем не то, что ожидаете.

Так что, когда вам задают вопрос дабы понять знаете ли вы и нужно ли вам это пояснять, то будьте добры отвечать, а не лезть в пузырь, иначе каким же образом вам помогать, не зная вообще вашего уровня?

То что вы написали означает следующее - в {....} передаются как объект POST данные, а вот то что в url, это GET данные, и они, как я уже говорил, не будут обрабатываться клиентом, то есть ни jQuery, ни браузер на это не реагирует. Если вам эти данные необходимы в url, то пропускайте их через метод encodeURIComponent(здесь_обрабатываемый_текст).

Что касается данных передаваемых POST и методом Ajax, то я уже писал выше - если все правильно делаете, то и проблем быть не должно.

  Ответить  
 
 автор: Trivium   (10.09.2014 в 00:59)   письмо автору
 
   для: confirm   (10.09.2014 в 00:51)
 

Я прекрасно знаю, что этот код делает. То идёт передача через адрес. Я её использовать стал как крайний вариант. И между прочим при передаче через адрес, а не параметры иногда строка приходит правильная, но вот через параметры - никогда. Уровень у меня вполне достаточный и я довольно редко захожу на форумы, и уже пишу в который раз, что на одном сайте нормально, а тут ничего не помогает при том, что я перепробовал уже около десятка способов как передать кириллицу в PHP скрипт через AJAX. И через адрес и через параметры и через кодирование строки. Ну вот как может не передаться нормально строка через encodeURIComponent? В любой кодировке? Там же идут ASCII коды символов через %. Но она не передаётся! А писать, что я мелю чушь или спрашивать меня логичные вещи, так это вызывает ответную реакцию, т.к. не надо никого ламаками считать.

  Ответить  
 
 автор: confirm   (10.09.2014 в 01:16)   письмо автору
 
   для: Trivium   (10.09.2014 в 00:59)
 

Еще раз - encodeURIComponent() это метод Javascript, служит для кодирования данных на стороне клиента, дабы не было косяков, например, если в тексте будет +, то без этого метода вы получите на сервер вместо строки ее обрубок. То есть этот метод для URL, и только в том случае, если вы сами подставляете данные в URL.

Для передачи формой методом GET этого не требуется, все сделает браузер.

А вот на передачу данных методом POST это не оказывает влияния, можете сами в этом убедиться, например передав данные в base64 с клиента Ajax методом.

Другое дело, как вы эти данные "подсовываете" Ajax, если сами, то вот тут по недосмотру может скрываться баг. А чтобы этого не было, используйте методы serialize() или serializeAray() jQuery. Но только учтите, баг не означающий "путаницы" кодировки, он означает "битые" данные.

Я тоже делал и не раз: клиент 1251, сервер по умолчанию 1251, работает Ajax, iconv. Проблем нет. Если настройки вашего сервера имеют конфликт в кодировке, то клиенту данные передавались бы ЁЁ не понять. Это были бы и козни Апача в том числе. А принимает данные (работает с ними) РНР, не думаю, что работая в 1251, он у вас установлен по умолчанию как UTF. Проверьте.

PS. Уже не помню в какой версии, но ранее в РНР наблюдались проблемы, если библиотека для мультбайтных строк подключалась ранее какой-то из них. какой тоже не помню. Но это было так давно, и вряд ли у вас такая древняя версия.

  Ответить  
 
 автор: vr-3d   (29.07.2016 в 08:46)   письмо автору
 
   для: confirm   (10.09.2014 в 01:16)
 

Здесь видел не плохой вариант http://jquery.com.ru

  Ответить  
 
 автор: nek-v   (11.08.2016 в 00:08)   письмо автору
 
   для: Trivium   (10.09.2014 в 00:59)
 

Посмотрите в php.ini и в .htaccess в корне проекта.
Возможно где то там укзана кодировка, отличная от нужной вам.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования