Форум Академгородка, Новосибирск > Ajax, Xml и русская кодировка
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Ajax, Xml и русская кодировка
Форум Академгородка, Новосибирск > Компьютеры и сети > Программирование > WEB-программирование
Astronom
Не могу добиться, чтобы ajax адекватно отображал русскоязычные символы, присылает в виде %**. Подскажите, в чем может быть ошибка?

Код
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<script type="text/javascript" src="ajaxtest.js"></script>
</head>
<body onload="process()">
Сервер желает узнать ваше имя:
<input type="text" id="myname">
<div id="divmessage"></div>
</body>
</html>


Javascript-обработчик

Код
var xmlHttp = createXmlHttpRequestObject();
function createXmlHttpRequestObject()
{
    var xmlHttp;
    var browser = navigator.appName;
    if(browser == "Microsoft Internet Explorer")
    {
        try
        {xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");}
        catch(e)
        {xmlHttp = false;}
    }
    else
    {
        try
        {xmlHttp = new XMLHttpRequest();}
        catch(e)
        {xmlHttp = false;}
    }
    if(!xmlHttp)
    alert("Ошибка создания объекта xmlHttpRequest");
    else return xmlHttp;
}

function process()
{    
    if(xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
    {
    
    name = encodeURIComponent(document.getElementById("myname").value);
    xmlHttp.open("GET", "ajaxtest.php?myname="+name, true);
    xmlHttp.onreadystatechange = handleServerResponse;
    xmlHttp.send(null);
    }
    else setTimeout("process()",1000);
}
function handleServerResponse()
{
    if (xmlHttp.readyState ==4)
    {
        if(xmlHttp.status ==200)
        {
            xmlResponse = xmlHttp.responseXML;
            xmlDocumentElement = xmlResponse.documentElement;
            helloMessage = xmlDocumentElement.firstChild.data;
            document.getElementById("divmessage").innerHTML = helloMessage;
            setTimeout("process()",1000);
        }
        else alert("При обращении к серверу возникли проблемы: " + xmlHttp.statusText);
    }
}


php-обработчик

Код
<?php
header("Content-Type: text/xml; charset=windows-1251");
echo '<?xml version="1.0" encoding="windows-1251" standalone="yes"?>';
echo '<response>';
$name = iconv('UTF-8','windows-1251',$_GET['myname']);
$usernames = array("Max", "Oleg", "Ivan", "Nik", "Sanya", "Alex", "Igor", "Leo", "Tolic" );
if(in_array(strtoupper($name), $usernames))
echo 'Здравствуйте, уважаемый'.htmlentities($name).'!';
elseif (trim($name)=="") echo 'Скажи мне, как тебя зовут, незнакомец!';
else echo htmlentities($name).', вы мне не знакомы!';
echo '</response>';
?>
Barthezz
3 поинта:
1) настраиваем дефолтную кодировку на сервере. В зависимости от реализации найдёте, где это подкрутить.
2) проверяем, что в принципе ajaxtest.php?myname="+name, true у вас открывается в браузере правильно как самостоятельная страница = кодировка верна.
3) если шаг 2 выполнен, начинаем играть параметрамии отправки запроса на сервер (http-заголовки, яростное гугление по настройке параметров ajax-запросов)
Astronom
Цитата(Barthezz @ 06.03.2011, 21:02) *
3 поинта:
1) настраиваем дефолтную кодировку на сервере. В зависимости от реализации найдёте, где это подкрутить.
2) проверяем, что в принципе ajaxtest.php?myname="+name, true у вас открывается в браузере правильно как самостоятельная страница = кодировка верна.
3) если шаг 2 выполнен, начинаем играть параметрамии отправки запроса на сервер (http-заголовки, яростное гугление по настройке параметров ajax-запросов)

Спасибо, вопрос решил. Оказалось, что можно обойтись и без htmlentities, которая не поддерживает windows-1251 smile.gif
atonator
Цитата(Astronom @ 06.03.2011, 23:32) *
Спасибо, вопрос решил. Оказалось, что можно обойтись и без htmlentities, которая не поддерживает windows-1251 smile.gif

оффтоп, но http://ru.php.net/manual/en/function.htmlentities.php поддерживает 1251
mishgun
пользуйтесь jQuery, на порядок меньше писанины будет
ну и да, htmlentities поддерживает 1251
Astronom
Возникла новая проблема, может кто поможет в решении.

Разрабатываю сортировку страниц сайта на ajax.


Произвожу упорядоченную выборку из Mysql
Код
<?php
$sql="SELECT * FROM pages ORDER BY pos";
$sql=mysql_query($sql);
?>

Скрипт-обработчик ajax

Код
<script>
$(document).ready(function(){
$("table").tableDnD({
  onDragClass: "dragRow",
  onDrop: function(table, row) {
    var rows = table.tBodies[0].rows;
    var messageString = "count="+rows.length+"&action=sort";
    for (var i=0; i<rows.length; i++) {
    
      messageString += "&q"+i+"="+rows[i].id;
    }
    $("#messageArea").html(messageString);
    $("table").find("tr[@id='"+ row.id +"']").fadeOut(700, function () {
      $(this).fadeIn(300);
    });
    $.ajax({
            type: "GET",
             url: "sort.php",
             timeout: 1000,
             data: messageString,
             success: function(data){$("#server").html(data);},
             error: function(data){$("#server").html("Error");}
         });
    
  },
  onDragStart: function(table, row) {
    $("#messageArea").html();
  }
});
});
</script>

<table>
<?php while($row=mysql_fetch_assoc($sql)){?>
<tr id="<?php echo $row['pos'];?>"><td>Разный контент</td></tr>

<?php  
?>
</table>

Методом GET передается строка вида:

Код
count=4&action=sort&q0=0&q1=1&q2=2&q3=3&... и так далее

скрипт PHP, к которому производится ajax запрос:

Код
if($_GET["action"]=="sort")
{
$query=array();
$query=$_GET;
unset($query['action'],$query['count']);
foreach($query as $key=>$value)
{
$new=intval(substr($key, 1));
$sql2="UPDATE pages SET pos=".$value." WHERE pos=".$new;
$sql2=mysql_query($sql2);
}
}

Код работает, но непредсказуемым образом - поле pos (позиция строки) в базе Mysql периодически сбивается после смещений строк таблицы, некоторые значения становятся одинаковыми и дальнейшая сортировка становится невозможной.
Периодически в поле pos появляется число 2147483647
Где в коде косяк(и), что исправить?
mishgun
$sql2="UPDATE pages SET pos=".$value." WHERE pos=".$new;
допустим были записи с pos=1 и с pos=2
юзер поменял их местами
первый апдейт: UPDATE pages SET pos=2 WHERE pos=1
теперь обе записи имеют pos=2
второй апдейт: UPDATE pages SET pos=1 WHERE pos=2
обе записи - pos=1
решается добавлением уникального id к каждой записи: т.е. в строке запроса q будет иметь индекс не по порядку, а равным id строки

2147483647 - это 32-битный -1 приведенный к беззнаковому 32-битному инту
Astronom
Цитата(mishgun @ 16.03.2011, 22:56) *
$sql2="UPDATE pages SET pos=".$value." WHERE pos=".$new;
допустим были записи с pos=1 и с pos=2
юзер поменял их местами
первый апдейт: UPDATE pages SET pos=2 WHERE pos=1
теперь обе записи имеют pos=2
второй апдейт: UPDATE pages SET pos=1 WHERE pos=2
обе записи - pos=1
решается добавлением уникального id к каждой записи: т.е. в строке запроса q будет иметь индекс не по порядку, а равным id строки

2147483647 - это 32-битный -1 приведенный к беззнаковому 32-битному инту

Пробую следующий апдейт: UPDATE pages SET pos=".$value." WHERE id=".$key." из foreach
Значения позиций все равно меняются не по желаемому сценарию. Хотя в пределах тех же восьми значений что и id (0 - 8).
Таблица в базе имеет вид [id pos content]. В начале вывода в браузер сортирую по позиции.
Что за напасть такая?((
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.