|
|
|
| Здравствуйте!
Перерыл весь Интернет, полон отчаяния и склонности к суициду!
Прошу помощи:
Дано:
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
Очень нужна помощь, скрипт уже полностью написан нужно исправить только этот баг, все остальное работает нормально, сбился с ног - помогите! | |
|
|
|
|
|
|
|
для: rised
(16.05.2007 в 05:25)
| | - | |
|
|
|
|
|
|
|
для: CNT
(16.05.2007 в 09:09)
| | Данные броузеру отправляйте в UTF-8, а в броузере обрабатывайте их с помощью decodeURIComponent()
var resp=decodeURIComponent(ajax_object.responseText);
|
| |
|
|
|
|
|
|
|
для: coloboc66
(16.05.2007 в 09:17)
| | coloboc66:
Спасибо за помощь (еще не пробовал - у меня нет этой глючной версии IE6)
Не могли бы Вы ответить на несколько вопросов:
1) Это известная проблема?
2) Почему именно одна версия IE6?
3) На что еще обратить внимание, если не сработает?
Спасибо! | |
|
|
|
|
|
|
|
для: rised
(16.05.2007 в 12:43)
| | 1. Да.
2. Насчет кол-ва версий не знаю, знаю только, что во всех броузерах все данные в национальных кодировках нужно отправлять, предварительно закодировав их в encodeURIComponent (т.е. в UTF-8), а принимать данные в броузер тоже нужно в UTF-8 (decodeURIComponent()). Хоть вы и не используете нац. кодировки, для гарантии пробуйте данные закодировать.
3. По ситуации нужно смотреть... | |
|
|
|
|
|
|
|
для: 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');
}
|
Благодарю | |
|
|
|
|
|
|
|
для: 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, но таких проблем, как у вас, не возникало... | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: koder_lis
(25.05.2007 в 11:19)
| | $conten=iconv("windows-1251","UTF-8",$conten);
echo $conten; | |
|
|
|
|
|
|
|
для: 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 ; }
|
помогите пожалуйста | |
|
|
|
|
|
|
|
для: koder_lis
(25.05.2007 в 12:22)
| | Быть такого не может: история - это UTF-8 А какая кодировка у вас стоит в файле, принимающем ответ сервера? Вы кодируете данные перед отправкой на сервер? | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: koder_lis
(25.05.2007 в 13:09)
| | А $conten - это что? И откуда берется? | |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: koder_lis
(25.05.2007 в 14:16)
| | Перед заголовками в РНР-файле нельзя писать НИЧЕГО. Все указанное вами выше header-ов перенесите ниже их. | |
|
|
|
|
|
|
|
для: 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;
|
| |
|
|
|
|
|
|
|
для: koder_lis
(25.05.2007 в 14:38)
| | А в какой кодировке у вас данные, находящиеся в БД? | |
|
|
|
|
|
|
|
для: coloboc66
(25.05.2007 в 15:01)
| | Сравнение MySQL utf8_general_ci | |
|
|
|
|
|
|
|
для: koder_lis
(25.05.2007 в 15:25)
| | MySQL-кодировка: Windows Cyrillic (cp1251) | |
|
|
|
|
|
|
|
для: 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 - это не одно и то же. По-моему. | |
|
|
|
|
|
|
|
для: coloboc66
(25.05.2007 в 15:52)
| | cp1251 и windows-1251 - это одно и то же.
а вот UTF-8 и Unicode - это похоже разная кодировка, или нет? | |
|
|
|
|
|
|
|
для: koder_lis
(28.05.2007 в 11:14)
| | Про Unicode не знаю. У меня складывается впечатление, что для корректной работы с нац. кодировками и аяксом нужно ВСЁ (в том числе и данные в мускуле) устанавливать в UTF-8. Ну в крайнем случае только файл, с которого отправляются данные форм, поставить в windows-1251 и в нем использовать encodeURI.. | |
|
|
|
|
|
|
|
для: coloboc66
(28.05.2007 в 11:41)
| | Убрал уже все, в том числе и запросы к Мускулу, вставил только код который Вы (coloboc66) написали, и все равно выдает РџСЂРёРІРµС, это в браузерах Мозила и IE7, я просто в шоке, сижу над проблемой третьи сутки, на меня уже начальник косо смотрит, на данном этапе использую Денвер с PHP5 | |
|
|
|
|
|
|
|
для: koder_lis
(28.05.2007 в 11:14)
| | так два вопроса появилось
первый связан с кодами в этой теме: почему тип стоит text/css, я на них не вижу и намека
второй связан с кодировкой Ajax.. что лучше:
1. encodeURIComponent + iconv + header
2. encodeURIComponent + decodeURIComponent
стоит ли возиться с заголовками или проще все операции делать в юнике | |
|
|
|
|
|
|
|
для: bronenos
(28.05.2007 в 11:43)
| | В "юнике" или в UTF-8? Это разные вещи по-моему. | |
|
|
|
|
|
|
|
для: bronenos
(28.05.2007 в 11:43)
| | ответ на первый вопрос - ставил и text/plain и text/cssи text/html разницы нет
ответ на второй вопрос - лучше конечно encodeURIComponent + decodeURIComponent, но decodeURIComponent -это метод Java, а уменя результат формируется в PHP и слово "Привет" надо как то передать в UTF-8, что получается с помощью функции iconv , но потом на стороне браузера не получается расшифровать то что закодировал | |
|
|
|
|
|
|
|
для: koder_lis
(28.05.2007 в 12:04)
| | to coder_lis: не знаю, как это у вас не получается? У меня получается во всех броузерах. А вот при выводе данных из БД - да, здесь вопрос... | |
|
|
|
|
|
|
|
для: coloboc66
(28.05.2007 в 12:18)
| | УРА!!! Вроде заработало исправил в Вашем (coloboc66) коде строку
header("Content-type: text/html; charset=windows-1251");
|
исправил на:
header("Content-type: text/html; charset=UTF-8");
|
жаль под рукой нет IE6 чтобы и там проверить, и с Мускула на ура берет данные
Вроде уже собаку на этом съел, так что если будут вопросы пишите | |
|
|
|
|
|
|
|
для: koder_lis
(28.05.2007 в 12:25)
| | Ну да - это описка, у меня при тестировании стояло UTF-8 в header | |
|
|
|
|
|
|
|
для: coloboc66
(28.05.2007 в 12:28)
| | ага из-за этой описки я все выходные себе места не находил :-) | |
|
|
|
|
|
|
|
для: koder_lis
(28.05.2007 в 12:34)
| | В ИЕ6 будет нормально. У меня ИЕ6. | |
|
|
|