|
|
|
| Всем привет.
Пробую передать кириллическую строку через 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 и никаким способом никогда строки нормально не приходят. При чём на одном сайте это работает нормально, а на другой заливаю и там нет. Может быть с хостингом что-то? Но хостеры пишут, что у них всё нормально. Что может быть не так? А то перепробовал уже кажется всё, что можно было | |
|
|
|
|
|
|
|
для: Trivium
(09.09.2014 в 23:49)
| |
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
зачем это? параметры передаёте неправильно, в jquery есть штатные средства для этого, не нужно самому ничего кодировать | |
|
|
|
|
|
|
|
для: psychomc
(10.09.2014 в 00:00)
| | Так я ж говорю пробовал и в UTF-8 сохранять всё и её ставить кодировкой и без кодировки. И декодить на серваке через iconv, но глюк где-то то ли в jQuery происходит, то ли при передаче на сервак. | |
|
|
|
|
|
|
|
для: Trivium
(10.09.2014 в 00:09)
| | Не городите чуши, jQuery ни в чем перед вами не виновен. Все работает без проблем на Ajax хоть в этой библиотеке, хоть без нее с кодировкой 1251, если только самому не накосячить.
Если вы делаете правильно: клиент в 1251 -> серверу с по умолчанием 1251 -> получает utf -> iconv в 1251, и все работает. | |
|
|
|
|
|
|
|
для: confirm
(10.09.2014 в 00:23)
| | Я ж сказал на одном серваке работает нормально, читать надо внимательнее, а на другом нет.. Всё точно так же. Залил на один - работает, на другой - не работает. | |
|
|
|
|
|
|
|
для: Trivium
(10.09.2014 в 00:30)
| | Вот - клиент в 1251 -> серверу с по умолчанием 1251 -> получает utf -> iconv в 1251, и все работает.
Все. Более ничего не надо. А вообще, не лучше ли перейти на utf? Конечно любого будет давить жаба на лишние расходы в базе, но все таки с этим недостатком одновременно получите и большой выигрыш. | |
|
|
|
|
|
|
|
для: confirm
(10.09.2014 в 00:55)
| | Ну так я же говорю пробовал и utf8 и 1251. Но ни так, ни так не работает. И iconv тоже. Ни через get ни через post ни через передачу по адресу. Собрался переводить весь сайт в utf, начал тестить и ничего не работает. На другом серваке с 1251 работает. Вот я и думаю может с кодировками в апаче трабблы. | |
|
|
|
|
|
|
|
для: 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>
|
И проблем нет. Если и у вас этот пример будет работать, то ваша проблема не в кодировке, а в битых данных, а об этом уже писалось. | |
|
|
|
|
|
|
|
для: Trivium
(09.09.2014 в 23:49)
| | Вы не то пробуете. Это не проблема jQuery, собственно и проблемы ни какой нет, а есть тот факт, что Ajax работает только в кодировке UTF, поэтому ваш 1251 с клиента передается серверу в utf. А для того чтобы получить из него на сервере 1251 нужна функция не urldecode, а iconv(). | |
|
|
|
|
|
|
|
для: 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>
|
| |
|
|
|
|
|
|
|
для: Trivium
(10.09.2014 в 00:20)
| | А как вы думаете - ajax.php?w=АБВГД - это что такое? | |
|
|
|
|
|
|
|
для: confirm
(10.09.2014 в 00:24)
| | И что же? | |
|
|
|
|
|
|
|
для: Trivium
(10.09.2014 в 00:29)
| | Уважаемый, это не бредни, это вы обязаны знать, что данные передаваемые формой браузер должным образом обработает, но если вы сами подставляете такие данные в url на стороне клиента, то вот здесь как раз и нужен механизм url кодирования, в противном случае на сервере вы можете получить совсем не то, что ожидаете.
Так что, когда вам задают вопрос дабы понять знаете ли вы и нужно ли вам это пояснять, то будьте добры отвечать, а не лезть в пузырь, иначе каким же образом вам помогать, не зная вообще вашего уровня?
То что вы написали означает следующее - в {....} передаются как объект POST данные, а вот то что в url, это GET данные, и они, как я уже говорил, не будут обрабатываться клиентом, то есть ни jQuery, ни браузер на это не реагирует. Если вам эти данные необходимы в url, то пропускайте их через метод encodeURIComponent(здесь_обрабатываемый_текст).
Что касается данных передаваемых POST и методом Ajax, то я уже писал выше - если все правильно делаете, то и проблем быть не должно. | |
|
|
|
|
|
|
|
для: confirm
(10.09.2014 в 00:51)
| | Я прекрасно знаю, что этот код делает. То идёт передача через адрес. Я её использовать стал как крайний вариант. И между прочим при передаче через адрес, а не параметры иногда строка приходит правильная, но вот через параметры - никогда. Уровень у меня вполне достаточный и я довольно редко захожу на форумы, и уже пишу в который раз, что на одном сайте нормально, а тут ничего не помогает при том, что я перепробовал уже около десятка способов как передать кириллицу в PHP скрипт через AJAX. И через адрес и через параметры и через кодирование строки. Ну вот как может не передаться нормально строка через encodeURIComponent? В любой кодировке? Там же идут ASCII коды символов через %. Но она не передаётся! А писать, что я мелю чушь или спрашивать меня логичные вещи, так это вызывает ответную реакцию, т.к. не надо никого ламаками считать. | |
|
|
|
|
|
|
|
для: 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. Уже не помню в какой версии, но ранее в РНР наблюдались проблемы, если библиотека для мультбайтных строк подключалась ранее какой-то из них. какой тоже не помню. Но это было так давно, и вряд ли у вас такая древняя версия. | |
|
|
|
|
|
|
|
для: confirm
(10.09.2014 в 01:16)
| | Здесь видел не плохой вариант http://jquery.com.ru | |
|
|
|
|
|
|
|
для: Trivium
(10.09.2014 в 00:59)
| | Посмотрите в php.ini и в .htaccess в корне проекта.
Возможно где то там укзана кодировка, отличная от нужной вам. | |
|
|
|