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

HTML+CSS+JavaScript

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

 

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

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

тема: Кодировка responseText (Ajax)
 
 автор: rised   (16.05.2007 в 05:25)   письмо автору
 
 

Здравствуйте!
Перерыл весь Интернет, полон отчаяния и склонности к суициду!
Прошу помощи:

Дано:
index.php (включает alterNav.js, который обрабатывает alterNavAjax.php и получает ответ в виде html = responseText)
выставлена кодировка
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

alterNavAjax.php
в начале файла

//Указываем кодировку для Ajax
header("Content-type: text/html; charset=windows-1251");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);


Формирует select с набором option, результат уходит в responseText

Во всех браузерах работает нормально: IE7, FireFox 2, Opera 9, IE6 - никаких проблем с кодировкой нет, но, есть какая-то специфическая версия IE6, в которой приходят "знаки вопросов" и я ничего не могу поделать. Что я только не пробовал, но ничего не помогает.

Много прочитал про кодировку данных при отправке, но я не передаю кириллицу в запросе (использую GET) - там только цифры 1 или 2...

Вот версия глючного IE6:
6.0.2600.0000.xpclient.010817-1148

Очень нужна помощь, скрипт уже полностью написан нужно исправить только этот баг, все остальное работает нормально, сбился с ног - помогите!

   
 
 автор: CNT   (16.05.2007 в 09:09)   письмо автору
 
   для: rised   (16.05.2007 в 05:25)
 

-

   
 
 автор: coloboc66   (16.05.2007 в 09:17)   письмо автору
 
   для: CNT   (16.05.2007 в 09:09)
 

Данные броузеру отправляйте в UTF-8, а в броузере обрабатывайте их с помощью decodeURIComponent()

var resp=decodeURIComponent(ajax_object.responseText);

   
 
 автор: rised   (16.05.2007 в 12:43)   письмо автору
 
   для: coloboc66   (16.05.2007 в 09:17)
 

coloboc66:
Спасибо за помощь (еще не пробовал - у меня нет этой глючной версии IE6)

Не могли бы Вы ответить на несколько вопросов:
1) Это известная проблема?
2) Почему именно одна версия IE6?
3) На что еще обратить внимание, если не сработает?

Спасибо!

   
 
 автор: coloboc66   (16.05.2007 в 12:55)   письмо автору
 
   для: rised   (16.05.2007 в 12:43)
 

1. Да.
2. Насчет кол-ва версий не знаю, знаю только, что во всех броузерах все данные в национальных кодировках нужно отправлять, предварительно закодировав их в encodeURIComponent (т.е. в UTF-8), а принимать данные в броузер тоже нужно в UTF-8 (decodeURIComponent()). Хоть вы и не используете нац. кодировки, для гарантии пробуйте данные закодировать.
3. По ситуации нужно смотреть...

   
 
 автор: rised   (16.05.2007 в 13:09)   письмо автору
 
   для: coloboc66   (16.05.2007 в 12:55)
 

Меня немного смущает использование encodeURIComponent , точнее куда его вставлять.

Вот функция передачи данных:

function getActionsProcess( URL, fname )
    {
    //продолжать, если xmlHttp не пустой
    if (xmlHttp)
        {
        FNAME = fname;
        //попытаться установить соединение с сервером
        try 
            {
            FNAME = fname;
            //обратиться к php обработчику на сервере
            xmlHttp.open("GET", URL, true);
            xmlHttp.onreadystatechange = requestActions;
            //послать асинхронный запрос серверу
            xmlHttp.send(null);
            }
        //вывести сообщение об ошибке в случае неудачи
        catch (e)
            {
            alert("Невозможно соедениться с сервером:\n" + e.toString());
            }
        }
    }


Вот функция обработки ответа:
(приведен полный код, он немного перегружен, но не стал ничего резать - может ошибка в нем, уже вставил decodeURIComponent)

function requestActions()
    {
    //проверка занятости объекта XmlHttp
    if (xmlHttp.readyState == 4)
        {
        if (xmlHttp.status == 200)
            {
            if (FNAME == "goReg")
                {
                respSelect = "respCityDiv";
                }
            else if (FNAME == "goCity")
                {
                respSelect = "respCatDiv";
                }
            else if (FNAME == "goCat")
                {
                respSelect = "respSubCatDiv";
                }
            try 
                {
                var respActions = decodeURIComponent(xmlHttp.responseText);
                document.getElementById(respSelect).innerHTML = respActions;
                }
            catch (e)
                {
                alert("Ошибка чтения ответа функции goCity: " + e.toString());
                }
                FNAME = "";
            }    
        else
            {
            //вывести сообщение о состоянии
            alert("Возникли проблемы во время получения данных:\n" + xmlHttp.statusText);
            }
        }
    }


Вот одна из функций, которая вызывается на событие onSelect в форме:


function goReg()
    {
    var url="addFirmAjax.php?regId="+ document.forms['addForm'].respReg.value + "&goReg";
    getActionsProcess(url, 'goReg');
    }


Правильно ли я понимаю, что даже для переменной url такого типа нужно кодировать?
То есть должно выглядеть как:


function goReg()
    {
    var url="addFirmAjax.php?regId="+ document.forms['addForm'].respReg.value + "&goReg";
    getActionsProcess(encodeURIComponent(url), 'goReg');
    }


Благодарю

   
 
 автор: coloboc66   (16.05.2007 в 13:52)   письмо автору
 
   для: rised   (16.05.2007 в 13:09)
 

Не знаю: судя по вашему коду, вам и впрямь нет необходимости что-то кодировать. Вот этот кусок смущает в ПРИНЦИПЕ:

function getActionsProcess( URL, fname )
    {
    //продолжать, если xmlHttp не пустой
    if (xmlHttp)
        {
           FNAME = fname;
        //попытаться установить соединение с сервером
        try 
            {
             FNAME = fname;  
            //обратиться к php обработчику на сервере
            xmlHttp.open("GET", URL, true);
            xmlHttp.onreadystatechange = requestActions;
            //послать асинхронный запрос серверу
            xmlHttp[co.send(null);
            } 


Как оно вообще работает, непонятно???
Надо так по-идее:
URL=URL+"?fname="+FNAME;
На сервере, само собой, нужно отлавливать $_GET['fname']
если параметр нужно закодировать, то:
URL=URL+"?fname="+encodeURIComponent(FNAME);
У меня самого стоит ИЕ6, но таких проблем, как у вас, не возникало...

   
 
 автор: koder_lis   (25.05.2007 в 11:19)   письмо автору
 
   для: coloboc66   (16.05.2007 в 13:52)
 

У меня такая же проблема, все вроде понятно тут написано, только как отправлять данные броузеру в UTF-8, у меня файл пхп выводит хтмл так -

header("HTTP/1.0 200 OK");
header("HTTP/1.1 200 OK");
header("Cache-Control: no-cache, must-revalidate, max-age=0");
header("Expires: 0");
header("Pragma: no-cache");
header("Content-type: text/css; charset=windows-1251");


  echo $conten;

как закодировать $conten

   
 
 автор: coloboc66   (25.05.2007 в 11:27)   письмо автору
 
   для: koder_lis   (25.05.2007 в 11:19)
 

$conten=iconv("windows-1251","UTF-8",$conten);
echo $conten;

   
 
 автор: koder_lis   (25.05.2007 в 12:22)   письмо автору
 
   для: coloboc66   (25.05.2007 в 11:27)
 

добавил строку

$conten=iconv("windows-1251","UTF-8",$conten);
, и действительно в IE6 все заработало, но во всех остальных браузерах работать перестало выводит примерно так история
принимаю результат следующей функцией

 function HedeandLin(){     var xmlResponse = decodeURIComponent(xmlHttp.responseText);
  document.getElementById("response").innerHTML =   xmlResponse ; }

помогите пожалуйста

   
 
 автор: coloboc66   (25.05.2007 в 12:53)   письмо автору
 
   для: koder_lis   (25.05.2007 в 12:22)
 

Быть такого не может: история - это UTF-8 А какая кодировка у вас стоит в файле, принимающем ответ сервера? Вы кодируете данные перед отправкой на сервер?

   
 
 автор: koder_lis   (25.05.2007 в 13:09)   письмо автору
 
   для: coloboc66   (25.05.2007 в 12:53)
 

файл menu.php

$conten = "текст меню";
header("HTTP/1.0 200 OK");
header("HTTP/1.1 200 OK");
header("Cache-Control: no-cache, must-revalidate, max-age=0");
header("Expires: 0");
header("Pragma: no-cache");
header("Content-type: text/css; charset=windows-1251");

$conten=iconv("windows-1251","UTF-8",$conten);
  echo $conten; 

в index файле используется кодировка text/html; charset=windows-1251
файл ajax.js

 var xmlHttp = createXmlHttpRequestObject();
function createXmlHttpRequestObject()
{ var xmlHttp;
   try  {  xmlHttp = new XMLHttpRequest(); }
  catch(e)  {  var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0",
"MSXML2.XMLHTTP.5.0",
"MSXML2.XMLHTTP.4.0",
"MSXML2.XMLHTTP.3.0",
"MSXML2.XMLHTTP",
"Microsoft.XMLHTTP"); 
for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++)
    {try   {  xmlHttp = new ActiveXObject(XmlHttpVersions[i]); }
    catch (e) {}}
  }
  if (!xmlHttp)alert("Error creating the XMLHttpRequest object."); 
   else return xmlHttp;
     }

function process(ui){
    if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
      {
       xmlHttp.open('GET', Url + ui,true);
       xmlHttp.onreadystatechange = handleServerResponse;
       xmlHttp.send(null);
     }
    else 
       setTimeout('process()', 1000); //хм еще возможно в этой строке ошибка т.к. в функции не указан параметр, наверное правильно так setTimeout('process(ui)', 1000);???
}

function handleServerResponse()
{
  if (xmlHttp.readyState == 4)
  {
    if (xmlHttp.status == 200)
    {
      try
      {
        HedeandLin();
      }
      catch(e)
      {
        displayError(e.toString());
      }
    }

    else
    {
      alert("There was a problem accessing the server: " + xmlHttp.statusText);
    }
  }
}     

function HedeandLin() 
    {     
    var xmlResponse = decodeURIComponent(xmlHttp.responseText);
   document.getElementById("response").innerHTML =   xmlResponse ;
   }


выводит история, раньше все нормально работало кроме как в IE6

   
 
 автор: coloboc66   (25.05.2007 в 14:01)   письмо автору
 
   для: koder_lis   (25.05.2007 в 13:09)
 

А $conten - это что? И откуда берется?

   
 
 автор: koder_lis   (25.05.2007 в 14:16)   письмо автору
 
   для: coloboc66   (25.05.2007 в 14:01)
 

переменная берется из базы

/// запросы к базе данных и т.п., скрипт большой приводить его весь не буду
 $sqlselect = "SELECT id,  name FROM " . PREFIX . "_category" ;
        $r = $db->query($sqlselect);
$conten = "текст меню".  $r[name];  /// заносится результат в этом месте

header("HTTP/1.0 200 OK");
header("HTTP/1.1 200 OK");
header("Cache-Control: no-cache, must-revalidate, max-age=0");
header("Expires: 0");
header("Pragma: no-cache");
header("Content-type: text/css; charset=windows-1251");

$conten=iconv("windows-1251","UTF-8",$conten);
  echo $conten; 

   
 
 автор: coloboc66   (25.05.2007 в 14:29)   письмо автору
 
   для: koder_lis   (25.05.2007 в 14:16)
 

Перед заголовками в РНР-файле нельзя писать НИЧЕГО. Все указанное вами выше header-ов перенесите ниже их.

   
 
 автор: koder_lis   (25.05.2007 в 14:38)   письмо автору
 
   для: coloboc66   (25.05.2007 в 14:29)
 

изменил но проблема осталась

<?header("HTTP/1.0 200 OK");
header("HTTP/1.1 200 OK");
header("Cache-Control: no-cache, must-revalidate, max-age=0");
header("Expires: 0");
header("Pragma: no-cache");
header("Content-type: text/css; charset=windows-1251");

/// запросы к базе данных и т.п., скрипт большой приводить его весь не буду
 
$sqlselect "SELECT id,  name FROM " PREFIX "_category" ;
        
$r $db->query($sqlselect);
$conten "текст меню".  $r[name];  /// заносится результат в этом месте


$conten=iconv("windows-1251","UTF-8",$conten);
  echo 
$conten;  

   
 
 автор: coloboc66   (25.05.2007 в 15:01)   письмо автору
 
   для: koder_lis   (25.05.2007 в 14:38)
 

А в какой кодировке у вас данные, находящиеся в БД?

   
 
 автор: koder_lis   (25.05.2007 в 15:25)   письмо автору
 
   для: coloboc66   (25.05.2007 в 15:01)
 

Сравнение MySQL utf8_general_ci

   
 
 автор: koder_lis   (25.05.2007 в 15:50)   письмо автору
 
   для: koder_lis   (25.05.2007 в 15:25)
 

MySQL-кодировка: Windows Cyrillic (cp1251)

   
 
 автор: coloboc66   (25.05.2007 в 15:52)   письмо автору
 
   для: koder_lis   (25.05.2007 в 15:25)
 

Я так понимаю, что вся проблема в кодировках БД.
Вот это:

header("Content-type: text/html; charset=windows-1251");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
$content="Привет";
$content=iconv("windows-1251","UTF-8",$content);
echo $content;

и вот это:

document.getElementById("div_id").innerHTML=decodeURIComponent(ajax.responseText);

у меня корректно работает во всех броузерах.
cp1251 и windows-1251 - это не одно и то же. По-моему.

   
 
 автор: koder_lis   (28.05.2007 в 11:14)   письмо автору
 
   для: coloboc66   (25.05.2007 в 15:52)
 

cp1251 и windows-1251 - это одно и то же.
а вот UTF-8 и Unicode - это похоже разная кодировка, или нет?

   
 
 автор: coloboc66   (28.05.2007 в 11:41)   письмо автору
 
   для: koder_lis   (28.05.2007 в 11:14)
 

Про Unicode не знаю. У меня складывается впечатление, что для корректной работы с нац. кодировками и аяксом нужно ВСЁ (в том числе и данные в мускуле) устанавливать в UTF-8. Ну в крайнем случае только файл, с которого отправляются данные форм, поставить в windows-1251 и в нем использовать encodeURI..

   
 
 автор: koder_lis   (28.05.2007 в 11:56)   письмо автору
 
   для: coloboc66   (28.05.2007 в 11:41)
 

Убрал уже все, в том числе и запросы к Мускулу, вставил только код который Вы (coloboc66) написали, и все равно выдает РџСЂРёРІРµС, это в браузерах Мозила и IE7, я просто в шоке, сижу над проблемой третьи сутки, на меня уже начальник косо смотрит, на данном этапе использую Денвер с PHP5

   
 
 автор: bronenos   (28.05.2007 в 11:43)   письмо автору
 
   для: koder_lis   (28.05.2007 в 11:14)
 

так два вопроса появилось
первый связан с кодами в этой теме: почему тип стоит text/css, я на них не вижу и намека
второй связан с кодировкой Ajax.. что лучше:
1. encodeURIComponent + iconv + header
2. encodeURIComponent + decodeURIComponent
стоит ли возиться с заголовками или проще все операции делать в юнике

   
 
 автор: coloboc66   (28.05.2007 в 11:57)   письмо автору
 
   для: bronenos   (28.05.2007 в 11:43)
 

В "юнике" или в UTF-8? Это разные вещи по-моему.

   
 
 автор: koder_lis   (28.05.2007 в 12:04)   письмо автору
 
   для: bronenos   (28.05.2007 в 11:43)
 

ответ на первый вопрос - ставил и text/plain и text/cssи text/html разницы нет
ответ на второй вопрос - лучше конечно encodeURIComponent + decodeURIComponent, но decodeURIComponent -это метод Java, а уменя результат формируется в PHP и слово "Привет" надо как то передать в UTF-8, что получается с помощью функции iconv , но потом на стороне браузера не получается расшифровать то что закодировал

   
 
 автор: coloboc66   (28.05.2007 в 12:18)   письмо автору
 
   для: koder_lis   (28.05.2007 в 12:04)
 

to coder_lis: не знаю, как это у вас не получается? У меня получается во всех броузерах. А вот при выводе данных из БД - да, здесь вопрос...

   
 
 автор: koder_lis   (28.05.2007 в 12:25)   письмо автору
 
   для: coloboc66   (28.05.2007 в 12:18)
 

УРА!!! Вроде заработало исправил в Вашем (coloboc66) коде строку

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

исправил на:

header("Content-type: text/html; charset=UTF-8");

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

Вроде уже собаку на этом съел, так что если будут вопросы пишите

   
 
 автор: coloboc66   (28.05.2007 в 12:28)   письмо автору
 
   для: koder_lis   (28.05.2007 в 12:25)
 

Ну да - это описка, у меня при тестировании стояло UTF-8 в header

   
 
 автор: koder_lis   (28.05.2007 в 12:34)   письмо автору
 
   для: coloboc66   (28.05.2007 в 12:28)
 

ага из-за этой описки я все выходные себе места не находил :-)

   
 
 автор: coloboc66   (28.05.2007 в 12:43)   письмо автору
 
   для: koder_lis   (28.05.2007 в 12:34)
 

В ИЕ6 будет нормально. У меня ИЕ6.

   
Rambler's Top100
вверх

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