php5 и XML

mfl
На сайте с 16.10.2006
Offline
134
mfl
2497

Вот столкнулся с проблемой.

При разборе XML документа, разборщик возвращает результат в кодировке UTF-8, вне зависимости от кодировки исходного документа. Почитав мануал, понял, что так и должно быть.

Но тогда, почему на php4 результат возвращался в кодировке исходного документа?

Вот простой пример, на php4 возвращает массивы в windows-1251, на php5 - в UTF-8


<?php
$text='<?xml version="1.0" encoding="windows-1251"?><html.code><title>название</title></html.code>';
$p = xml_parser_create();
xml_parse_into_struct($p, $text, $vals, $index);
xml_parser_free($p);
print_r ($vals);
?>

Конечно можно решить проблему используя iconv. но в этом случае надо будет перебирать массив конвертируя кодировку каждого элемента.

ZeHer
На сайте с 01.04.2006
Offline
87
#1

Это только на последней версии 5.20 так, на предыдущих версиях пятерки, отдавало любую кодировку.

Пол дня убил, пока не понял почему граббер перестал работать, не стал мудрить iconv() выполнил перед загрузкой. Ох уж эти хостеры, смена ПО происходит как всегда тайно 😡

А причины такого поведения парсера самому интересны, я списал это на настройки умолчальных кодировок сервера, но раз не у меня одного так, то видимо произошли изменя в php какие-то, раз нестандартная кодировка не проходит.

надо будет перебирать массив конвертируя кодировку каждого элемента.

Не обязательно я целиком конвертирую.

	if (preg_match("/\<\?xml\s+.+encoding\=[\"'](.+)[\"'].*\?\>/", $rss, $matches)) {

$rssCharset = strtolower($matches[1]);
} else {
$rssCharset = "utf-8";
}

if ($rssCharset != "utf-8") {
$rss = preg_replace("/(\<\?xml\s+.+encoding\=[\"'])(.+)([\"'].*\?\>)/", "\$1" . "utf-8" . "\$3", $rss);
$rss = iconv($rssCharset, "utf-8", $rss);
}
mfl
На сайте с 16.10.2006
Offline
134
mfl
#2
Не обязательно я целиком конвертирую.

Дело в том, что необходимо конвертировать именно результат парсинга (массив) в "windows-1251".

XML-документ из win.. в utf конечно одной строкой конвертируется. А уже результат в обратном напрвалении не получится.

mfl добавил 21.02.2008 в 16:10

В общем, вопрос теперь сводится к тому, как перекодировать массив?

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

Имеются ли решения перекодировки массива без обхода всех ключей?

mfl
На сайте с 16.10.2006
Offline
134
mfl
#3

Что так и нет ни каких идей по этому поводу?

Яб обошол весь массив и не парился с этим, но дело в том, что массив многомерный :(

PB
На сайте с 05.04.2006
Offline
51
#4

mfl, А Вы массивом пользоваться собираетесь? так конвертируйте элементы в момент использования.

Сайт находится в разработке. (http://www.e-anatomy.ru)
G
На сайте с 01.10.2007
Offline
16
#5

вы работаете с xml_parser_create(), по корому в мануале сказано, что он поддерживает на выходе только: ISO-8859-1, UTF-8 and US-ASCI, UTF-8 по-умолчанию...

можно воспользоваться чем-нить типа:

<?php

function array_change_enc( &$item, $key)

{

$item = iconv('UTF-8', 'CP1251', $item);

return true;

}

/*

.... получение массива из xml .....

*/

array_walk_recursive($vals, 'array_change_enc');

?>

а можно просто воспользоваться SimpleXml к примеру

mfl
На сайте с 16.10.2006
Offline
134
mfl
#6
PriBoy:
mfl, А Вы массивом пользоваться собираетесь? так конвертируйте элементы в момент использования.

Слишком много элементов, дописывать для каждой переменной в каждом файле долго по времени выйдет. А сам парсер - отдельная функция которая создается в одном файле, потом инклудится.

genbit

Большое спасибо, с array_walk_recursive все так просто.

А SimpleXml разьве работает с cp1251? В мануале про кодировки для SimpleXml, что то вообще не написано.

G
На сайте с 01.10.2007
Offline
16
#7

mfl, незачто


А SimpleXml разьве работает с cp1251? В мануале про кодировки для SimpleXml, что то вообще не написано.

да, работает, да и удобнее он парсера... особенно если использовать xpath


<?php
$text='<?xml version="1.0" encoding="windows-1251"?><html.code><title>название</title></html.code>';

$xml = simplexml_load_string($text); // или simplexml_load_file($filePath);
$array = (array)$xml; // элегантным движением, объект превращается в массив
$titles = $xml->xpath('//title'); // юзаем xpath

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий