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

HTML+CSS+JavaScript

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

 

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

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

тема: Кодировка меняется после подгрузки аяксом
 
 автор: darkozoid   (03.03.2014 в 10:03)   письмо автору
 
 

Доброе утро, подскажите пожалуйста в чем может быть дело?

Есть страница в win-1251 при загрузке аяксом в нужном месте вывожу результат работы php скрипта. И все хорошо с кодировкой, НО!

Стоит таймер, который через определенное время запускает ту же самую функцию аякс-вывода.... и вот после второй и далее загрузок вместо русских букв вижу вопросики...

Я уже голову сломал себе... в хроме все работает нормально, а вот в остальных браузерах нет....

При этом если в браузере сменить кодировку на utf-8, то вся страница становится в вопросах - как и должна, но и в этом блоке вопросы не исчезают... - а ведь должны если это utf-8... как узнать тогда что это за кодировка?

  Ответить  
 
 автор: confirm   (03.03.2014 в 10:27)   письмо автору
 
   для: darkozoid   (03.03.2014 в 10:03)
 

Вы уж определитесь в какой кодировке ваша страница, и если она в 1251, то с чего бы она не была в вопросах при указании браузеру utf-8.

Если у вас все в 1251, то Ajax передаст на сервер данные все равно а utf-8. Ваши серверные скрипты тоже значит работают с 1251, а значит этот запрос нужно конвертировать в 1251, и возвращать в 1251 с предварительной передачей заголовка указывающего кодировку 1251. А вот JSON данные наоборот, перед их кодированием строковые значение нужно будет конвертировать из 1251 в utf.

  Ответить  
 
 автор: darkozoid   (03.03.2014 в 11:22)   письмо автору
 
   для: confirm   (03.03.2014 в 10:27)
 

страница в win-1251 и скрипты в ней же...

а как конертировать результат в win-1251???

проблема то в том что там и не utf-8 приходит, если бы это так было, то при смене кодировки в браузере вся страница стала бы вопросами, кроме этой части... ведь так? а этого не происходит...

  Ответить  
 
 автор: confirm   (03.03.2014 в 11:38)   письмо автору
 
   для: darkozoid   (03.03.2014 в 11:22)
 

Конвертируется функцией iconv(), а вот клиент на сервер передает данные именно в utf, даже если ваша страница в 1251. Открывайте отладчик и смотрите то, что возвращает сервер.

  Ответить  
 
 автор: darkozoid   (03.03.2014 в 16:48)   письмо автору
 
   для: confirm   (03.03.2014 в 11:38)
 

Если открыть исполняемый скрипт (php) то сыдает страницу в win-1251 как и должен, хотя в отладчике все написано как то так: Íàøè Êëèåíòû вместо наши клиенты. это что же значит из базы криво достается?

Все равно не понимаю почему при первом аякс запросе все нормально, а потом такая хрень?

  Ответить  
 
 автор: confirm   (03.03.2014 в 17:40)   письмо автору
 
   для: 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-представление. В общем это проблемы не асинхронного запроса, а вашего скрипта, как написали, так и работает. Разбирайтесь где у вас ошибки, а мне неведомо почему у вас сперва хорошо, а потом косяк.

  Ответить  
 
 автор: Enter   (03.03.2014 в 17:01)   письмо автору
 
   для: darkozoid   (03.03.2014 в 10:03)
 

У меня к вам вопрос: а в чем смысл использовать win-1251? Какие выгоды этой кодировки по сравнению с UTF-8?

  Ответить  
 
 автор: darkozoid   (04.03.2014 в 08:30)   письмо автору
 
   для: Enter   (03.03.2014 в 17:01)
 

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

  Ответить  
 
 автор: Enter   (04.03.2014 в 17:31)   письмо автору
 
   для: darkozoid   (04.03.2014 в 08:30)
 

лучше, конечно, поменять

  Ответить  
 
 автор: darkozoid   (05.03.2014 в 12:22)   письмо автору
 
   для: Enter   (04.03.2014 в 17:31)
 

конечно... но на это надо время, а его мне не оплатят...

  Ответить  
 
 автор: Enter   (05.03.2014 в 13:20)   письмо автору
 
   для: darkozoid   (05.03.2014 в 12:22)
 

тогда да.. понятно

  Ответить  
 
 автор: kosta_in_net   (28.03.2014 в 17:16)   письмо автору
 
   для: 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");

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

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