|
|
|
| Доброе утро, подскажите пожалуйста в чем может быть дело?
Есть страница в win-1251 при загрузке аяксом в нужном месте вывожу результат работы php скрипта. И все хорошо с кодировкой, НО!
Стоит таймер, который через определенное время запускает ту же самую функцию аякс-вывода.... и вот после второй и далее загрузок вместо русских букв вижу вопросики...
Я уже голову сломал себе... в хроме все работает нормально, а вот в остальных браузерах нет....
При этом если в браузере сменить кодировку на utf-8, то вся страница становится в вопросах - как и должна, но и в этом блоке вопросы не исчезают... - а ведь должны если это utf-8... как узнать тогда что это за кодировка? | |
|
|
|
|
|
|
|
для: darkozoid
(03.03.2014 в 10:03)
| | Вы уж определитесь в какой кодировке ваша страница, и если она в 1251, то с чего бы она не была в вопросах при указании браузеру utf-8.
Если у вас все в 1251, то Ajax передаст на сервер данные все равно а utf-8. Ваши серверные скрипты тоже значит работают с 1251, а значит этот запрос нужно конвертировать в 1251, и возвращать в 1251 с предварительной передачей заголовка указывающего кодировку 1251. А вот JSON данные наоборот, перед их кодированием строковые значение нужно будет конвертировать из 1251 в utf. | |
|
|
|
|
|
|
|
для: confirm
(03.03.2014 в 10:27)
| | страница в win-1251 и скрипты в ней же...
а как конертировать результат в win-1251???
проблема то в том что там и не utf-8 приходит, если бы это так было, то при смене кодировки в браузере вся страница стала бы вопросами, кроме этой части... ведь так? а этого не происходит... | |
|
|
|
|
|
|
|
для: darkozoid
(03.03.2014 в 11:22)
| | Конвертируется функцией iconv(), а вот клиент на сервер передает данные именно в utf, даже если ваша страница в 1251. Открывайте отладчик и смотрите то, что возвращает сервер. | |
|
|
|
|
|
|
|
для: confirm
(03.03.2014 в 11:38)
| | Если открыть исполняемый скрипт (php) то сыдает страницу в win-1251 как и должен, хотя в отладчике все написано как то так: Íàøè Êëèåíòû вместо наши клиенты. это что же значит из базы криво достается?
Все равно не понимаю почему при первом аякс запросе все нормально, а потом такая хрень? | |
|
|
|
|
|
|
|
для: darkozoid
(03.03.2014 в 16:48)
| |
<?
if($_POST) {
header('Content-type: text/html; charset=windows-1251');
if(key($_POST)=='d') {
$char = mb_detect_encoding($_POST['d']);
$s = iconv($char, "windows-1251", $_POST['d']);
echo $s . ' Принято в '. $char . ', возвращено в cp1251.';
} else {
$char = mb_detect_encoding($_POST['j']);
$s = iconv($char, "windows-1251", $_POST['j']);
$s .= ' Принято в '. $char . ', возвращено в юникод.';
echo json_encode(array('txt'=>iconv("windows-1251", $char, $s)));
}
exit;
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
<link rel="stylesheet" type="text/css" href="" />
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<script>
$(function() {
$.post(location, {d:'Передаваемый текст.'}, function(d) {
$('#b1').text(d);
});
$.post(location, {j:'Передаваемый текст.'}, function(d) {
$('#b2').text(d.txt);
//ответ будет как
//{"txt":"\u041f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.
//\u041f\u0440\u0438\u043d\u044f\u0442\u043e \u0432 UTF-8, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u043e
//\u0432 \u044e\u043d\u0438\u043a\u043e\u0434."}
}, 'json');
});
</script>
</head>
<body>
<p>Возврат в cp1251</p>
<div id="b1"></div>
<p>Возврат JSON в utf-8</p>
<div id="b2"></div>
</body>
</html>
|
Можете запускать как угодно, хоть по таймеру многократно, хоть одноразово, отображение ответа будет корректным в любом случае.
То что вы показываете говорит о том, что вы так и не поняли какими передаются данные асинхронным запросом, и что их нужно преобразовывать в случае кодировки cp1251, ибо показанное означает - возвращается html-представление. В общем это проблемы не асинхронного запроса, а вашего скрипта, как написали, так и работает. Разбирайтесь где у вас ошибки, а мне неведомо почему у вас сперва хорошо, а потом косяк. | |
|
|
|
|
|
|
|
для: darkozoid
(03.03.2014 в 10:03)
| | У меня к вам вопрос: а в чем смысл использовать win-1251? Какие выгоды этой кодировки по сравнению с UTF-8? | |
|
|
|
|
|
|
|
для: Enter
(03.03.2014 в 17:01)
| | да нету смысла... просто надо у всего сайта менять кодировку, а там такая помойка, что даже начинать не хочу, да и времени нету на это | |
|
|
|
|
|
|
|
для: darkozoid
(04.03.2014 в 08:30)
| | лучше, конечно, поменять | |
|
|
|
|
|
|
|
для: Enter
(04.03.2014 в 17:31)
| | конечно... но на это надо время, а его мне не оплатят... | |
|
|
|
|
|
|
|
для: darkozoid
(05.03.2014 в 12:22)
| | тогда да.. понятно | |
|
|
|
|
|
|
|
для: Enter
(03.03.2014 в 17:01)
| | У меня, к примеру. любимый редактор не работает в утф. Приходится писать в кодировке виндовс. Так что, причин для кодировки виндовс может быть много.
Что касается перекодировки, то я сделл такую функцию:
function auto_translate($s) {
if (@$_POST['char_set_test']){
if (@$_POST['char_set_test']=='аБвГдЕёЖз') { //input in 1251
return $s;
} else if(function_exists('iconv')) {
if(iconv('UTF-8','CP1251',$_POST['char_set_test'])=='аБвГдЕёЖз') { //input in utf-8
return iconv('UTF-8', 'CP1251', $s);
} else if(iconv('KOI-8','CP1251',$char_set_test)=='аБвГдЕёЖз') { //input in
return iconv('KOI-8', 'CP1251', $s);
}
} else {
return $s; // нечем конвертировать
}
}
return $s; // форма не нуждается в проверке
}
|
В формах добавил поле:
<input type="hidden" name="char_set_test" value="аБвГдЕёЖз">
при проверке данных из формы проверка ключа
if($key !='char_set_test'){// перевести в кодировку виндовс 1251
$item=auto_translate($item);
}
пхп-скрипт выдает текст, начиная с
Header("Content-Type: text/html; charset=windows-1251"); | |
|
|
|