информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Все любят мед
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Ядро Linux избавляется от российских... 
 20 лет Ubuntu 
 Tailscale окончательно забанила... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / sysadmin
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Варианты: 01.12.06 14:32  Число просмотров: 3449
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
Варианты:

Если работаешь с PHP5, вызывай не так:
$xml_parser = xml_parser_create();

---
а так:
$xml_parser = xml_parser_create('');

---

Или делай так:

$rx = '/<?xml.*encoding=['"](.*?)['"].*?>/m';

if (preg_match($rx, $source, $m)) {
  $encoding = strtoupper($m[1]);
} else {
  $encoding = "UTF-8";
}

if($encoding == "UTF-8"|$encoding == "US-ASCII"|$encoding == "ISO-8859-1") {
  $parser = xml_parser_create($encoding);
} else {

  if(function_exists('mb_convert_encoding')) {
    $encoded_source = @mb_convert_encoding($source, "UTF-8", $encoding);
  }

  if($encoded_source != NULL) {
    $source = str_replace ( $m[0],'<?xml version="1.0" encoding="utf-8"?>', $encoded_source);
  }

  $parser = xml_parser_create("UTF-8");
}

xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");

---

Очень интересная статья про libxml, expat, PHP4, PHP5 и разные чарсеты здесь:
http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss

Желаю удачи. Проблема в том что у expat проблемы с "угадываньем" кодировок. Тебя подвело то что на первом серваке всё работало. НЕ знаю что это была за конфигурация - винды с микрософтовским libxml или линукс с установленными пакетами поддержки разных языков. В общем рекомендую использовать принудительную перекодировку в UTF-8 во избежание будущих проблем. И дополнительно принять решение: либо тестировать на PHP4 и PHP5 либо выбрать одну поддерживаемую платформу и держаться её (вставить в начало этого модуль чек версии).
<sysadmin>
кто нть сталкивался с настройкой под freebsd парсера xml? как побороть windows-1251? 29.11.06 19:30  
Автор: hamstr Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Мало информации. Что за прасер? В чем проблема c win-1251? 29.11.06 19:52  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
вопрос именно в настройке библиотек, а не в програмном коде,... 30.11.06 11:43  
Автор: hamstr Статус: Незарегистрированный пользователь
<"чистая" ссылка>
вопрос именно в настройке библиотек, а не в програмном коде, поскольку это-же код на другой машине выполняется. и парсит правильно тот-же документ.
expat. 30.11.06 11:37  
Автор: hamstr Статус: Незарегистрированный пользователь
<"чистая" ссылка>
expat.
php скрипт создает парсер и пытается им пропарсить xml документ с кодировкой windows-1251
в результате получаю ошибку.
not well-formed (invalid token)
на первом кирилическом символе.
XML_ParserCreate принимает параметр 30.11.06 13:15  
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
XML_ParserCreate принимает параметр
 const XML_Char *encoding 

---
со скриптом все нормально. дело в настройке сервера... 30.11.06 14:01  
Автор: hamstr Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> XML_ParserCreate принимает параметр
>
>  const XML_Char *encoding 
> 

---
со скриптом все нормально. дело в настройке сервера. поскольку это не дефолтовая настройка PHP она включается при сборке. может я чего не учел, когда PHP пересобирал.
самое интересное, что и с expat от apache и со скачанным с соайта проекта ошибка одна и тож...
у меня создалось впечатление что парсер при сборке должен знать что такое windows-1251 в частости.
но в документации пока не нашел.
может кто здесь подскажет... или опытом поделится...
Обожаю такие ответы :) Чувак, если бы у тебя было "всё... 30.11.06 14:49  
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
> со скриптом все нормально. дело в настройке сервера.

Обожаю такие ответы :) Чувак, если бы у тебя было "всё нормально" со скриптом, ты не бегал бы по форумам а сидел и плевал в потолок. Что значит "всё нормально"?
Обожаю такие советы. 30.11.06 17:58  
Автор: hamstr Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> > со скриптом все нормально. дело в настройке сервера.
>
> Обожаю такие ответы :) Чувак, если бы у тебя было "всё
> нормально" со скриптом, ты не бегал бы по форумам а сидел и
> плевал в потолок. Что значит "всё нормально"?
Обожаю такие советы.
Чувак! Я же написал в этой ветке, что ЭТОТЖЕ скрипт БЕЗ ИЗМЕНЕНИЙ читает ТОТЖЕ xml файл но в другом програмном окружении без ошибок.
ОК. не буду занудствовать и напоминать тебе про старину... 30.11.06 22:12  
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
ОК. не буду занудствовать и напоминать тебе про старину Мерфи :) Давай попробуем решить твою проблему. Ты можешь выложить следуещее:

1. Кусок кода работы с XML. От первой xml-related функции, до той где происходит ошибка.
2. phpinfo сервера где работает "правильный код"
3. phpinfo сервера где не работает "правильный код".

Если phpinfo слишком большие, можно взять оттуда только куски где говорится о xml ,expat,charset, encoding, char,version

?
$insideitem = false; 01.12.06 01:08  
Автор: hamstr Статус: Незарегистрированный пользователь
<"чистая" ссылка>
$insideitem = false;
$tag = "";
$title = "";
$description = "";
$link = "";

function startElement($parser, $name, $attrs) {
global $insideitem, $tag, $title, $description, $link;
if ($insideitem) {
$tag = $name;
} elseif ($name == "ITEM") {
$insideitem = true;
}
}

function endElement($parser, $name) {
global $insideitem, $tag, $title, $description, $link;
if ($name == "ITEM") {
printf("<dt><a href='%s'>%s</a></dt>",
trim($link),htmlspecialchars(trim($title)));
printf("<dd>%s</dd>",htmlspecialchars(trim($description)));
$title = "";
$description = "";
$link = "";
$insideitem = false;
}
}

function characterData($parser, $data) {
global $insideitem, $tag, $title, $description, $link;
if ($insideitem) {
switch ($tag) {
case "TITLE":
$title .= $data;
break;
case "DESCRIPTION":
$description .= $data;
break;
case "LINK":
$link .= $data;
break;
}
}
}

$MODUL["dir"]["xml"]='http://www*****ru/price/m.xml';

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "characterData");
$fp = fopen($MODUL["dir"]["xml"],"r")
or die("Error reading RSS data.");
while ($data = fread($fp, 4096))
xml_parse($xml_parser, $data, feof($fp))
or die(sprintf("XML error: %s at line %d column %d",
xml_error_string(xml_get_error_code($xml_parser)),
xml_get_current_line_number($xml_parser),
xml_get_current_column_number($xml_parser)));
fclose($fp);
xml_parser_free($xml_parser);
Варианты: 01.12.06 14:32  
Автор: NKritsky <Nickolay A. Kritsky> Статус: Elderman
<"чистая" ссылка>
Варианты:

Если работаешь с PHP5, вызывай не так:
$xml_parser = xml_parser_create();

---
а так:
$xml_parser = xml_parser_create('');

---

Или делай так:

$rx = '/<?xml.*encoding=['"](.*?)['"].*?>/m';

if (preg_match($rx, $source, $m)) {
  $encoding = strtoupper($m[1]);
} else {
  $encoding = "UTF-8";
}

if($encoding == "UTF-8"|$encoding == "US-ASCII"|$encoding == "ISO-8859-1") {
  $parser = xml_parser_create($encoding);
} else {

  if(function_exists('mb_convert_encoding')) {
    $encoded_source = @mb_convert_encoding($source, "UTF-8", $encoding);
  }

  if($encoded_source != NULL) {
    $source = str_replace ( $m[0],'<?xml version="1.0" encoding="utf-8"?>', $encoded_source);
  }

  $parser = xml_parser_create("UTF-8");
}

xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, "UTF-8");

---

Очень интересная статья про libxml, expat, PHP4, PHP5 и разные чарсеты здесь:
http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss

Желаю удачи. Проблема в том что у expat проблемы с "угадываньем" кодировок. Тебя подвело то что на первом серваке всё работало. НЕ знаю что это была за конфигурация - винды с микрософтовским libxml или линукс с установленными пакетами поддержки разных языков. В общем рекомендую использовать принудительную перекодировку в UTF-8 во избежание будущих проблем. И дополнительно принять решение: либо тестировать на PHP4 и PHP5 либо выбрать одну поддерживаемую платформу и держаться её (вставить в начало этого модуль чек версии).
однако mbstring в сборку php включить пришлось ;-) 07.12.06 19:05  
Автор: hamstr Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Спасибо. Очень ценная помощь. Все заработало. ;-) 07.12.06 19:04  
Автор: hamstr Статус: Незарегистрированный пользователь
<"чистая" ссылка>
xml который парсится. 01.12.06 01:14  
Автор: hamstr Статус: Незарегистрированный пользователь
<"чистая" ссылка>
<?xml version="1.0" encoding="windows-1251"?>
<rss version="2.0">
<channel>
<item>
<title>&quot;Ведьмак&quot; в России</title>
<link>http://www.cnews.ru/news/line/index.shtml?2006/11/29/219010</link>
<category>

Игры
</category>

<pubDate>Wed, 29 Nov 2006 01:35:14 +0300</pubDate>
<description>
Компания &quot;Новый Диск&quot; объявила о подписании контракта с CD Projekt RED о лицензировании и дистрибуции игры The Witcher на территории России,...
</description>

<guid>http://www.cnews.ru/news/line/index.shtml?2006/11/29/219010</guid>
</item>
</channel>
</rss>
спасибо за понимание ;-) 01.12.06 00:59  
Автор: hamstr Статус: Незарегистрированный пользователь
<"чистая" ссылка>
и спасибо за уделенное внимание
я могу это выложить... только прежде вот чего...
с libexpat собирается валидатор xml
xmlwf и я проверил им xml файл
так вот чего он на строку
<?xml version="1.0" encoding="windows-1251"?> пишет
n.xml:1:30: unknown encoding
а если сделать iconv -f windows-1251 -t utf-8
потом в первой строке xml файла поменять кодировку на utf-8
и дать на вход скрипту - все парсится.
5 копеек - все таки в коде... 30.11.06 19:18  
Автор: whiletrue <Роман> Статус: Elderman
<"чистая" ссылка>
Код наврное под старую какую-то версию PHP оптимизирован... Не может такого быть?
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach