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

HTML+CSS+JavaScript

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

 

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

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

тема: XMLHttpRequest и кодировка
 
 автор: WebTech   (06.09.2006 в 15:46)   письмо автору
 
 

Когда отправляю некий текст на сервер с помощью XMLHttpRequest из поля, а потом его отправляю в браузер обратно в XML, то получаются кракозябры.
В браузере стоит, например windows-1251 и в XML ставлю то же

<?xml version="1.0" encoding="windows-1251" standalone="yes"?>

Причем такая проблема только с Оперой.
Если кто сталкивался, подскажите, что делать? Я новичок в аяксе, может чего и сам напутал. Или это глюк оперы? :-(

   
 
 автор: 12345   (06.09.2006 в 16:26)   письмо автору
 
   для: WebTech   (06.09.2006 в 15:46)
 

Проблема должна быть со всеми бр-рами, потому что Ajax работает только c UTF-8. Поищите по стовам "кодировка Ajax кириллица"

   
 
 автор: coloboc66   (06.09.2006 в 17:19)   письмо автору
 
   для: 12345   (06.09.2006 в 16:26)
 

У меня тоже получались кракозяблики при encoding=windows-1251 пока не поменял ее на UTF-8 и xml-файл не сохранил в UTF-8 Тогда проблемы отпали.
"...а потом его отправляю в браузер обратно в XML..."
Не могли бы вы показать на небольшом примере, как это делается? А то я только responseText понимаю, а как с responseXML работать- не представляю. Вы ведь здесь именно это свойство используете, да?

   
 
 автор: 12345   (06.09.2006 в 18:11)   письмо автору
 
   для: coloboc66   (06.09.2006 в 17:19)
 

Разбор дерева DOM.

http://www.webreference.com/programming/javascript/jf/column12/index.html - How to Develop Web Applications with Ajax

http://www.sitepoint.com/article/remote-scripting-ajax :
Parsing the Data in an XMLHttpRequest Object
If we've made a successful request, two properties of the XMLHttpRequest object may contain data:

responseXML stores a DOM-structured object of any XML data that was retrieved by the object. This object is navigable using the standard JavaScript DOM access methods and properties, such as getElementsByTagName(), childNodes[ ] and parentNode.
responseText stores the data as one complete string. If the content type of the data supplied by the server was text/plain or text/html, then this is the only property that will contain data. A copy of any text/xml data will be flattened and placed here as an alternative to responseXML.

Depending upon the complexity of the data, it may be easier to return data simply as a plain text string, thereby making the XML in XMLHttpRequest redundant. However, for more complex data types, you'll probably want to use an XML format, such as this:

<?xml version="1.0" ?> 
<user> 
       <name>John Smith</name> 
       <email>john@smith.com</email> 
</user>


We are able to access different parts of the data using standard DOM access methods. Remember that data contained between tags is considered to represent child text nodes of the parent, so we have to take that extra layer of structure into account when we retrieve the data:

var nameNode = requester.responseXML.getElementsByTagName("name")[0]; 
var nameTextNode = nameNode.childNodes[0]; 
var name = nameTextNode.nodeValue;


We must also be careful about whitespace: indenting values in the XML file may produce unwanted whitespace in the value, or add additional text nodes.
----------------------------------------
Работа с Dom: http://javascript.aho.ru/files/article-DOM.htm
----------------------------------------
"Подгрузка XML и последующее чтение его в JS" (обсуждение одного кода) :

   
 
 автор: WebTech   (06.09.2006 в 18:40)   письмо автору
 
   для: coloboc66   (06.09.2006 в 17:19)
 

XML создаю на сервере в PHP

<?php
header 
('Content-Type: text/xml');
// заголовок XML
echo '<?xml version="1.0" encoding="windows-1251" ?>';
echo 
'<response>';
// здесь просто текст
echo '</response>';
?>

А разбираю потом следующим образом

res = request.responseXML;
doc_el = res.documentElement;
message = doc_el.firstChild.data;
// дальше вывод


Я пробовал ставить UTF-8 - получаются кракозябры в любом браузере. А если поставить koi или windows-1251, то IE и фокс нормально все показывают, а опера нет.

   
 
 автор: WebTech   (06.09.2006 в 18:20)   письмо автору
 
   для: 12345   (06.09.2006 в 16:26)
 

-

   
 
 автор: coloboc66   (07.09.2006 в 09:17)   письмо автору
 
   для: WebTech   (06.09.2006 в 18:20)
 

А попробуйте в файле РНР вот это поставить, может- поможет...

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

Нужно ставить вверху файла перед всеми операторами.

   
 
 автор: WebTech   (07.09.2006 в 18:27)   письмо автору
 
   для: coloboc66   (07.09.2006 в 09:17)
 

Решил проблему с оперой. Оказывается я писал код в ANSI :-) Перекодировал все в UTF-8 и в опере заработало! Текст стал правильно отображаться. Зато в фоксе испортилось :-( Я ничего не понимаю.
Как вообще надо расставлять эти кодировки? В браузере какой charset надо выставлять?
Может быть мне прислать код полностью?

   
 
 автор: coloboc66   (07.09.2006 в 20:47)   письмо автору
 
   для: WebTech   (07.09.2006 в 18:27)
 

Я думаю- в html и РНР-док-е надо ставить windows-1251, а в xml-док-е надо ставить UTF-8 и сохранять его в UTF-8.

   
 
 автор: WebTech   (08.09.2006 в 10:29)   письмо автору
 
   для: coloboc66   (07.09.2006 в 20:47)
 

У меня XML формируется динамически скриптом. Как его можно сохранить в UTF?

<?php

$name 
$_GET['name']; // передается из браузера с помощью XMLHttpRequest

header ('Content-Type: text/xml');

echo 
'<?xml version="1.0" encoding="UTF-8"?>';

echo 
'<response>';

echo 
'Некий текст, который формируется динамически'.$name;

echo 
'</response>';
?>

Это мой скрипт, который формирует ответ в XML. Дело в том, что вот эта $name выглядит потом в браузере кракозябрами, а строка "Некий текст, который формируется динамически" выглядит нормально.

   
 
 автор: coloboc66   (08.09.2006 в 10:32)   письмо автору
 
   для: WebTech   (08.09.2006 в 10:29)
 

"Как его можно сохранить в UTF?"(динамически)- а вот это сложный вопрос. Может 12345 знает? А в РНР у вас стоит вот это?
header("Content-type: text/xml; charset=windows-1251"); 

И в html- файле 1251 тоже...

   
 
 автор: 12345   (08.09.2006 в 14:17)   письмо автору
 
   для: coloboc66   (08.09.2006 в 10:32)
 

Динамически его не хранят, а генерируют. Если переменная содержит с-1251, а выдаётся в UTF, то конечно, будет несоответствие. Очевидный вывод - надо перекодировать при выдаче. (Или хранить в UTF.) То, что константа идёт правильно - понятно, она или прекодируется автоматически, или страница файла PHP в UTF-е. Все вопросы про кодировку упираются в необходимость иметь функцию перекодировки, посмотрите здесь на форуме (в этой теме уже советовал, 2-й пост).

   
 
 автор: WebTech   (08.09.2006 в 17:53)   письмо автору
 
   для: 12345   (08.09.2006 в 14:17)
 

Проблема решилась :-)
В браузерном скрипте отправляемые данные закодировал с помощью encodeURIComponent(). На стороне сервера никаких перекодировок не использовал. И во всех браузерах теперь все правильно отображается :-)
Всем спасибо огромное! :-)

   
 
 автор: coloboc66   (09.09.2006 в 22:57)   письмо автору
 
   для: WebTech   (08.09.2006 в 17:53)
 

encodeURIComponent()- это что- метод ява-скрипт? Или что? В моем справочнике про это нет ничего... Все-равно не ясно, почему решилась проблема с кодировкой- серверный скрипт ведь никак не зависит от браузерного. Или у вас сервер получает данные в кириллице (обработанной с помощью encodeURIComponent), обрабатывает их и ответные данные тоже выдает в кириллице? Тогда объяснимо.
$name = $_GET['name']; 

Вот это ваше $name- оно в кириллице, да? И в браузере вы делаете примерно так:

var name='Имя';
name=encodeURIComponent(name);
document.forms(0).name.value=name;

И это имя отсылаете, да?

   
 
 автор: WebTech   (11.09.2006 в 15:27)   письмо автору
 
   для: coloboc66   (09.09.2006 в 22:57)
 

Да, все так, как вы описали.
EncodeURIComponent - это функция JavaScript, которая кодирует строку, как компонент URL, т.е. некоторые символы в управляющие последовательности.
Я думаю, что кириллица в UTF как раз и должна быть закодирована для безопасной передачи.
Хотя может быть и ошибаюсь. Но так все работает :-)

http://www.w3schools.com/jsref/jsref_encodeURIComponent.asp

   
Rambler's Top100
вверх

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