Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Русская кодировка в Ayax ,XML методом POST, Выдет в UTF-8, когад надо в Win-1251 
:(
    Опции темы
911
  Дата 26.8.2006, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 25.8.2006

Репутация: нет
Всего: нет



Дублирую свой топик, т.к. по ходу не туда его написал.... Вот он
------------------------------------------------------------
Значит суть и проблема такова. Имееться страничка index.html, в левой части кнопочки а в правой пустое место, на нем и отображается наша страничка методом XML POST, без ее перезагрузки. В коде использую javaScript. 
Вот значит кнопка 
Код

<SPAN onmouseover="lightup('pic10')" style="CURSOR: pointer" onclick="LINK_ajax('main.htm','main_div');" onmouseout="turnoff('pic10')">
<IMG height=57 src="image/main-1.gif" width=323 border=0 
name=pic10></SPAN> 

 
 Сделана графический, с элементом onmouseover и onmouseout. при нажатии получаем: onclick="LINK_ajax('main.htm','main_div');" ,
вот тут и запускается мой скрипт   
 smile 
Код

function LINK_ajax(http, div_name) { //funзгo para links

    var LINK_xmlhttp = false;

    try { LINK_xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
    catch (e) { try { LINK_xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
    catch (e) { try { LINK_xmlhttp = new XMLHttpRequest(); }
    catch (e) { LINK_xmlhttp = false; }}}
    if (!LINK_xmlhttp) return null;

    document.getElementById('load_div').style.visibility="visible";
    switch_banner();
    

    LINK_xmlhttp.open("GET", http, true);

    LINK_xmlhttp.onreadystatechange = function() {
        if (LINK_xmlhttp.readyState == 4) {
            document.getElementById('load_div').style.visibility="hidden";

            if (LINK_xmlhttp.responseText.indexOf("<script type=\"text/javascript\">") > -1) {
                var x = LINK_xmlhttp.responseText.indexOf("<script type=\"text/javascript\">") + "<script type=\"text/javascript\">".length;
                var y = LINK_xmlhttp.responseText.indexOf("</script>") - x;
                eval(LINK_xmlhttp.responseText.substr(x, y));
            }

            if (LINK_xmlhttp.responseText.indexOf('ALERT|') > -1) 
                window.alert(LINK_xmlhttp.responseText.substr(LINK_xmlhttp.responseText.indexOf('|') + 1));
            else
                document.getElementById(div_name).innerHTML = LINK_xmlhttp.responseText + ' ';
        }
    }

    LINK_xmlhttp.send(null);  

    return false;
}

function POST_ajax(http, div_name, frm_name) { //funзгo para posts

    var POST_xmlhttp = false;
    var frm = false
    var url = "";


    try { POST_xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
    catch (e) { try { POST_xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
    catch (e) { try { POST_xmlhttp = new XMLHttpRequest(); }
    catch (e) { POST_xmlhttp = false; }}}
    if (!POST_xmlhttp) return null;

    frm = document.getElementById(frm_name);

    document.getElementById('load_div').style.visibility="visible";

    url = "frm_name=" + frm_name;

    for (i = 0; i < frm.elements.length; i++) {
        frm.elements[i].disabled = true;
        if (frm.elements[i].type == "checkbox") {
            if (frm.elements[i].checked)
                frm.elements[i].value = 1;
            else
                frm.elements[i].value = 0;
        }
        url = url + "&" + frm.elements[i].name + "=" + escape(frm.elements[i].value);
    }


    POST_xmlhttp.open("POST", http, true);

    POST_xmlhttp.onreadystatechange = function() {
        if (POST_xmlhttp.readyState == 4) {
            document.getElementById('load_div').style.visibility="hidden";

            for (i = 0; i < frm.elements.length; i++) {
                if (frm.elements[i].type == "checkbox")
                    frm.elements[i].checked = false;
                if (frm.elements[i].type == "password")
                    frm.elements[i].value = "";
                frm.elements[i].disabled = false;
            }

            if (POST_xmlhttp.responseText.indexOf("<script type=\"text/javascript\">") > -1) {
                var x = POST_xmlhttp.responseText.indexOf("<script type=\"text/javascript\">") + "<script type=\"text/javascript\">".length;
                var y = POST_xmlhttp.responseText.indexOf("</script>") - x;
                eval(POST_xmlhttp.responseText.substr(x, y));
            }

            if (POST_xmlhttp.responseText.indexOf('ALERT|') > -1) {
                var x = POST_xmlhttp.responseText.indexOf('ALERT|') + "ALERT|".length;
                var y = POST_xmlhttp.responseText.indexOf('|ENDALERT') - x;
                window.alert(POST_xmlhttp.responseText.substr(x , y));
            } else
                document.getElementById(div_name).innerHTML = POST_xmlhttp.responseText + ' ';
        }
    }

    POST_xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    POST_xmlhttp.setRequestHeader("Content-length", url.length);
    POST_xmlhttp.setRequestHeader("Connection", "close");
    POST_xmlhttp.send(url);  

    return false;
} 
 





Значит заранее готовая страничка, в моем случае это main.htm, загружается в отведеном месте... Для него я использую даный код:
Код

<DIV class=style1 id=main_div></DIV>
<DIV id=load_div><SPAN class=style1>&nbsp;Loading...&nbsp;</SPAN> </DIV>
<script type=text/javascript>LINK_ajax('main.htm', 'main_div');</SCRIPT>


Вот тут то и начинается вся проблема    Если страница main.htm, имеет русский текст, то он отобразиться в виде Вопросов "??????". С английским все нормально! Как сделать нормальное отображение русского текста?     smile 

 smile  Пробывал множество из предложеных и найденых варинтов 
Цитата

<?
header("Content-type: text/plain; charset=windows-1251");
?>

//<meta http-equiv="Content-Type" content="text/html" charset=windows-1251">'); -даже такой подход изменения кодировки в JS не подошел.

Вобщем, как я уже потом понял Ajax изначально передает полученый текст в UTF-8... из чего я и получаю траблы с русским языком...
может кто напишит, что и где надо изменить в моем скрипте для получения Win-1251 smile 
Голова уже просто болит.... а сайт надо сдалать как можно быстрее... 

 smile  Вобщем данный скрипт, может кому и пригодиться, т.к. в данный момент он 100% рабочий только с англо язычным написанием текста.
PM MAIL   Вверх
vasac
Дата 26.8.2006, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



А ты не пытайся работать на клиентской части с win1251. Ты лучше серверную на utf переведи.
PM WWW   Вверх
12345c
Дата 26.8.2006, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Впрос 99 раз обсуждался (поиск по форуу) и все пришли к выводу, что XMLHttp работает только с UTF-8.
PM WWW   Вверх
911
Дата 26.8.2006, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 25.8.2006

Репутация: нет
Всего: нет



Вобщем может оно и так... но попробывав открыв все это через Operu, русский текст отобразился smile 
Когда в IE одни вопросы....  smile  Конечно все хорошо, но как мы знаем Opera, долеко не первый в списке используемых браузеров... по этому это не выход... Что касается XML существует такое как таблица стилей.... но она тоже не помогла...  smile
Может есть какие то соображения? 
PM MAIL   Вверх
vasac
Дата 26.8.2006, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: 13
Всего: 36



911, какая таблица стилей? Сказали же "XMLHttp работает только с UTF-8". Если не можешь перенести всю серверную часть на utf-8, перекодируй тогда входные данные из utf в свою кодировку, а ответ обратно в utf.
Смотри 
mb_convert_encoding
iconv

Это сообщение отредактировал(а) vasac - 26.8.2006, 16:06
PM WWW   Вверх
12345c
Дата 26.8.2006, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Круглый
****


Профиль
Группа: Vingrad developer
Сообщений: 2018
Регистрация: 26.12.2005
Где: наша не пропадала ?

Репутация: 57
Всего: 101



Опера последней внедрила эту технологию и, как видно, учла недоработки с кодировками.
PM WWW   Вверх
911
Дата 26.8.2006, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 25.8.2006

Репутация: нет
Всего: нет



И опять все возможные посылки, за поиском информации, и нет однозначного ответа smile 
На одном из форумов посоветовали:
Цитата

Указание кодировки в meta не поможет, т.к. AJAX работает с XML, а не HTML. Для него все, что не прошло проверку парсером является просто мусором, который
он разрешает забрать через responseText.

Рекомендую проделать эту процедуру руками через telnet.
Пример:

telnet www.myhost.ru 80
GET /path HTTP/1.1
Host: www.myhost.ru
User-agent: aaa

Потом посмотри в начале вывода заголовок content-type.


Есть еще много вариантов решения проблемы.
Напр., упаковать HTML внутрь XML:
<?xml version="1.0" encoding="windows-1251"?>
<root><![CDATA[................HTML....TEXT......(не содержащий последовательности ]]> !!!)]]><root>

Можно забить на AJAX (тут он совсем не в кассу) и воспользоваться скрытым iframe - тогда meta будет отрабатывать.


В принципе частично согласен.... можно взять и писать на Фрейме.... Но возникает всега проблема с его размером и позиционированием, что приводит не к лучшему выходу решения данной проблемы  smile 

Вобщем самое просто решение  smile  Это писать без использования Ajax'a и XML, просто сделать с перезагрузкой страницы...  smile 
Т.к. на поиск ответа, и возможного решения проблемы уйдет не мало времени и нервов...
-------
З.Ы. Но все же интересно, как это сделать.... smile 
PM MAIL   Вверх
Sardar
Дата 26.8.2006, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



911, в чём проблема отдавать ответ сервера в UTF-8? Если только "потому что хачу!" то убедись что на основной странице, где LINK_ajax вызываем, кодировка именно cp1251, она должна быть задана как заголовках от сервера, так (не помешает) и в <meta>. Также убедись что скрипты в cp1251. В итоге вопросов не будет, но привязан ты будешь к cp1251, что в современном мире довольно криво выглядит.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
911
Дата 27.8.2006, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 25.8.2006

Репутация: нет
Всего: нет



ну вобщем да, на основной странице, в моем случае index.htm как раз и есть кодировка win-1251. + на вызываемой странице указывал кодировку win-1251 + устанавливал в параметре скрипта, так и в Мета тегах! вобщем все равно не выходит... да в принципи можете сами это попробывать  smile  (если кому действительно это интересно) 
Вот вобщем урезаный код index.htm
Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD><TITLE></TITLE>
<META http-equiv=Content-Type content="text/html; charset=windows-1251">


<script language=javascript src="1.js" 
type=text/javascript></SCRIPT>
<script language=JavaScript type=text/JavaScript>
<!--
function MM_reloadPage(init) {  //reloads the window if Nav4 resized
  if (init==true) with (navigator) {if ((appName=="Netscape")&&(parseInt(appVersion)==4)) {
    document.MM_pgW=innerWidth; document.MM_pgH=innerHeight; onresize=MM_reloadPage; }}
  else if (innerWidth!=document.MM_pgW || innerHeight!=document.MM_pgH) location.reload();
}
MM_reloadPage(true);
//-->
</SCRIPT>

<STYLE type=text/css>#Layer2 {
    Z-INDEX: 4; LEFT: 38px; WIDTH: 310px; POSITION: absolute; TOP: 690px; HEIGHT: 787px
}
#main_div {
    Z-INDEX: 5; LEFT: 349px; WIDTH: 364px; POSITION: absolute; TOP: 220px; HEIGHT: 115px 
}
#load_div {
    LEFT: 500px; VISIBILITY: hidden; COLOR: #ffffff; POSITION: absolute; TOP: 165px; BACKGROUND-COLOR: #ff0000; FONT: "arial"
}
.style1 {
    FONT-SIZE: 10px; FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif
}
.style2 {
    COLOR: #000000
}
#Layer5 {
    Z-INDEX: 6; LEFT: 488px; WIDTH: 144px; POSITION: absolute; TOP: 405px; HEIGHT: 115px
}
</STYLE>

<META content="MSHTML 6.00.2900.2180" name=GENERATOR>
</HEAD>
<BODY>
<DIV id=Layer1 
style="Z-INDEX: 1; LEFT: 18px; WIDTH: 200px; POSITION: absolute; TOP: -4px; HEIGHT: 115px">
<P>
    <SPAN style="CURSOR: pointer" onclick="LINK_ajax('main.htm','main_div');">
<IMG height=57 src="image/main-1.gif" width=323 border=0 
name=pic10></SPAN> 
</P>

<P>&nbsp;</P></DIV>

<DIV id=Layer3 style="Z-INDEX: 3; LEFT: 343px; WIDTH: 376px; POSITION: absolute; TOP: 0px; HEIGHT: 289px">
<!--News -->


<P align=right>&nbsp;</P>
<P align=right>&nbsp;</P></DIV>
<DIV class=style1 id=main_div> 
<!--News-->
<DIV id=load_div><SPAN class=style1>&nbsp;Loading...&nbsp;</SPAN> </DIV>
<script type=text/javascript>LINK_ajax('main.htm', 'main_div');</SCRIPT>
</BODY></HTML>



далее код самого скрипта 1.js

Код

//<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">

function LINK_ajax(http, div_name) { //funзгo para links

    var LINK_xmlhttp = false;

    try { LINK_xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
    catch (e) { try { LINK_xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
    catch (e) { try { LINK_xmlhttp = new XMLHttpRequest(); }
    catch (e) { LINK_xmlhttp = false; }}}
    if (!LINK_xmlhttp) return null;

    document.getElementById('load_div').style.visibility="visible";
    switch_banner();
    

    LINK_xmlhttp.open("GET", http, true);

    LINK_xmlhttp.onreadystatechange = function() {
        if (LINK_xmlhttp.readyState == 4) {
            document.getElementById('load_div').style.visibility="hidden";

            if (LINK_xmlhttp.responseText.indexOf("<script type=\"text/javascript\">") > -1) {
                var x = LINK_xmlhttp.responseText.indexOf("<script type=\"text/javascript\">") + "<script type=\"text/javascript\">".length;
                var y = LINK_xmlhttp.responseText.indexOf("</script>") - x;
                eval(LINK_xmlhttp.responseText.substr(x, y));
            }

            if (LINK_xmlhttp.responseText.indexOf('ALERT|') > -1) 
                window.alert(LINK_xmlhttp.responseText.substr(LINK_xmlhttp.responseText.indexOf('|') + 1));
           else
                document.getElementById(div_name).innerHTML = LINK_xmlhttp.responseText + ' ';
    

        }
    }

    LINK_xmlhttp.send(null);  

    return false;
}

function POST_ajax(http, div_name, frm_name) { //funзгo para posts

    var POST_xmlhttp = false;
    var frm = false
    var url = "";


    try { POST_xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); }
    catch (e) { try { POST_xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); }
    catch (e) { try { POST_xmlhttp = new XMLHttpRequest(); }
    catch (e) { POST_xmlhttp = false; }}}
    if (!POST_xmlhttp) return null;

    frm = document.getElementById(frm_name);

    document.getElementById('load_div').style.visibility="visible";

    url = "frm_name=" + frm_name;

    for (i = 0; i < frm.elements.length; i++) {
        frm.elements[i].disabled = true;
        if (frm.elements[i].type == "checkbox") {
            if (frm.elements[i].checked)
                frm.elements[i].value = 1;
            else
                frm.elements[i].value = 0;
        }
        url = url + "&" + frm.elements[i].name + "=" + escape(frm.elements[i].value);
    }


    POST_xmlhttp.open("POST", http, true);

    POST_xmlhttp.onreadystatechange = function() {
        if (POST_xmlhttp.readyState == 4) {
            document.getElementById('load_div').style.visibility="hidden";

            for (i = 0; i < frm.elements.length; i++) {
                if (frm.elements[i].type == "checkbox")
                    frm.elements[i].checked = false;
                if (frm.elements[i].type == "password")
                    frm.elements[i].value = "";
                frm.elements[i].disabled = false;
            }

            if (POST_xmlhttp.responseText.indexOf("<script type=\"text/javascript\">") > -1) {
                var x = POST_xmlhttp.responseText.indexOf("<script type=\"text/javascript\">") + "<script type=\"text/javascript\">".length;
                var y = POST_xmlhttp.responseText.indexOf("</script>") - x;
                eval(POST_xmlhttp.responseText.substr(x, y));
            }

            if (POST_xmlhttp.responseText.indexOf('ALERT|') > -1) {
                var x = POST_xmlhttp.responseText.indexOf('ALERT|') + "ALERT|".length;
                var y = POST_xmlhttp.responseText.indexOf('|ENDALERT') - x;
                window.alert(POST_xmlhttp.responseText.substr(x , y));
            } else
                document.getElementById(div_name).innerHTML = POST_xmlhttp.responseText + ' ';
        }
    }

    POST_xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    POST_xmlhttp.setRequestHeader("Content-length", url.length);
    POST_xmlhttp.setRequestHeader("Connection", "close");
    POST_xmlhttp.send(url);  

    return false;
}

var i = 4;
function switch_banner() {
    var j = i;
    var banner_image = new Array ( );
    banner_image[00] = "./image/banner01.gif";
    banner_image[01] = "./image/banner02.jpg";
    banner_image[02] = "./image/banner03.jpg";
    banner_image[03] = "./image/banner04.jpg";

    while (i == j)
        i = Math.floor ( Math.random ( ) * banner_image.length );

    document['banner'].src = banner_image[i];
}


вобщем далее делаем страничку main.htm
и пишим на ней все что хотим)))) Ну вобщем все это безобразие грузим и глядим, что кодировка падает=( smile 
PM MAIL   Вверх
Sardar
Дата 27.8.2006, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 78
Всего: 317



911, это не возможно smile
Поставь в index.htm текст кирилицей, убедись что ты его видишь. Если да, то страница в виндовой 1251, браузер забьёт на meta если в заголовке от сервера Content-type: указана кодировка.

Далее телнетом выдерни 1.js, убедись что браузер отдаёт его как Content-type: text/javascript без всяких кодировок, скрипт будет пользовать кодировку index.htm

Затем телнетом сделай запрос к main.htm, убедись что сервер отдаёт его как Content-type: text/htm, charset=cp1251. XMLHttpRequest забьёт на кодировки если не увидит валидного <?xml> и зачитает контент как UTF-8. Т.е. сервер должен отослать кодировку в Content-type.

Если выполнил всё выше и всё равно текст вопросами, то значит у тебя уникальный глючный браузер smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0583 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.