О наболевшем. PHP XML и кодировка.

Alex.Antipin

Новичок
О наболевшем. PHP XML и кодировка.

Господа. Написал вот такой небольшой скрипт:

Код:
<?php
if ( !file_exists("data.xml") )
	{
	$doc = domxml_open_mem('<?xml version="1.0"?><markers/>');
	$doc->dump_file("data.xml", false, true);
	echo "Файл создан<br />";
	}
else
	{
	if ( !$doc = domxml_open_file("data.xml") )
		{
		echo "Файл с маркерами имеет некорректный формат<br />";
		}
	else
		{
		$root = $doc->document_element();
		$marker = $doc->create_element("marker");
		$marker = $root->append_child($marker);

		$attr = $doc->create_attribute("info",$info);
		$attr = $marker->append_child($attr);

		$doc->dump_file("data.xml", false, true);
		echo " Маркер добавлен<br />";
		}
	}
?>
Этот скрипт получает из формы переменную $info (текст на русском) и ещё несколько переменных, которые я убрал для компактности, и формирует XML из этого формата:
Код:
<?xml version="1.0"?>
<markers>
<marker lat="23.212" lng="43.213" info="Текст на русском"/>
<marker lat="54.343" lng="43.542" info="И ещё разок"/>
</markers>
Вообщем, как вы уже наверное поняли, русский текст превращается в черт что.
Причем, в зависимости от различных попыток решить проблему (использование utf8_encode / decode, iconv, указание кодировки в ХМЛ файле), все равно получался глюк. Иногда получались коды, иногда просто квадратики и т.д. Но ни разу - НОРМАЛЬНАЯ КИРИЛЛИЦА.

В связи с этим несколько вопросов:
1. Возможна ли вообще корректная работа с кирилицей при следующих параметрах сервера (valuehost):
— PHP Version 4.3.10
— DOMXML
DOM/XML enabled
DOM/XML API Version 20020815
libxml Version 20614
HTML Support enabled
XPath Support enabled
XPointer Support enabled
DOM/XSLT enabled
libxslt Version 1.0.30
libxslt compiled against libxml Version 2.5.7
DOM/EXSLT enabled
libexslt Version 1.0.30

Читал, что есть некая переделанная библиотека http://dan.phpclub.net/files.html php_domxml, но хостер послал меня подальше с просьбой об апгрейде.

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

chameleon

Новичок
Этот скрипт получает из формы переменную $info (текст на русском)
кодировка какая?

Всегда русские символы конвертируй из однобайтной кодировки в utf-8 _перед_ отправкой в dom:
PHP:
$attr = $doc->create_attribute("info",iconv('Windows-1251','utf-8',$info));
 

Alex.Antipin

Новичок
при таком раскладе получается из слова «русский» следующее:
info="&#x440;&#x443;&#x441;&#x441;&#x43A;&#x438;&#x439;"

-~{}~ 06.12.06 00:15:

хм... коды преоразовались (
ещё раз

Код:
info="&#x440;&#x443;&#x441;&#x441;&#x43A;&#x438;&#x439;"
-~{}~ 06.12.06 00:16:

опять мимо )
info="& #x440 ; & #x443 ; &#x441 ; &#x441 ;& #x43A;&# x438;&# x439;"

пробелов воткнул.

-~{}~ 06.12.06 00:19:

на сколько я понимаю, перед сохранением нужно произвести каким-то образм оратную конвертацию из UTF в WIN.

Только не знаю как.
 

chameleon

Новичок
Ну ты сам себе сделал показательный пример :)...и чем ссылки на символы не устраивают? имхо, аккуратно все так проэскейплено.
 

Alex.Antipin

Новичок
Дело в том, что во-первых из-за этого значительно возрастает размер XML файла, во-вторых иногда было бы неплохо иметь возможность править его ручками. Хоть Google Maps и понимает текст в таком формате, все же может есть фозможность хранить XML в нормальном виде? И ещё один вопрос, если он будет храниться в нормальном, то при открытии файла dom парсером не возникнет опять пролем с кодировкой?
 

chameleon

Новичок
Мое имхо - такие данные лучше помещать в содержимое элементов а не атрибутов, поскольку возможностей у последних гораздо меньше. Если мне память не изменяет, значения аттрибутов в XML подчиняются синтаксису URI (или его подклассу).
 

Alex.Antipin

Новичок
Полностью согласен с тем что логичнее текст хранить в качестве текстового нода, а не атрибута, однако формат XML задаю не я.

Вопрос про хранение данных в нормальном виде остается открытым.
 

chameleon

Новичок
я думаю можно, т.к. все в utf-8. Вообще, тебе уже проще наваять подобный файл и попробовать открыть его самому :).. дело пары минут :)..
 

Alex.Antipin

Новичок
Я уже все «наваял» и проверил, все вполне работает с этими мнемониками (вроде так они называются). Так что проблема отчасти решена. Но хотелось бы ещё лучше
 

SergeR

Новичок
Если у тебя PHP4, попробуй использовать dump_mem вместо dump_file -- оно позволяет указывать кодировку.
 
Сверху