Warning: Sablotron error on line none: unknown encoding 'Windows-1251'

  • Автор темы Автор темы DiMA
  • Дата начала Дата начала

DiMA

php.spb.ru
Команда форума
Warning: Sablotron error on line none: unknown encoding 'Windows-1251'

Как профиксить эту проблему?
возникает тут:
$out=xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);

На сервере стоит 2 апача - старый и новый. На старом это работает. На новом - нет. Компили его так:

./configure
--with-xslt-sablot=/usr/local/sablot_new
--enable-xslt
--with-iconv=/usr/local/iconv_new

php 4.3.1
sablotron 0.97
expat 1.95.5
libiconv 1.7
 
Это из-за того, что в файлах написано:

<?xml version='1.0' encoding='windows-1251'?>
<xsl:stylesheet version="1.0" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:output method="html" indent='yes' encoding="windows-1251"/>


Если заменить windows-1251 на ISO-8859-1, то работает (но читать нельзя - иегорлифы). Ничего, кроме ISO-8859-1,2,3 и UTF-8 оно не понимает. Даже koi8-r.
 
Скорее всего сам sablotron компилировался без iconv. Поэтому парсер не понимает других кодировок.
Попробуй перекомпилить sablotron --with-iconv.

Далее. Если возникнут проблемы с парсингом, попробуй делать так:
PHP:
        $xh = xslt_create(); 
        $args = array ( 
            '/_xml' => $xml, 
            '/_xsl' => $xslt 
        ); 
        $result = xslt_process ( $xh, 'arg:/_xml', 'arg:/_xsl', NULL, $args)
            xslt_free ( $xh);
где $xml - данные, $xslt - шаблон.
 
Пробовал версии саблатрона 0.96, 0.97, 0.98, все компились с --with-iconv=путь и --with-expat=путь. В путях компиленные версии expat & iconv. Пробовал версии iconv 1.7, 1.8. Пробовал компилить саблотрон без пути "--with-iconv", чтобы бралось по умолчанию откуда-то. Всего раз 20 все перекомпилял с разными версиями.

phpinfo():

iconv
iconv support enabled
iconv implementation libiconv
iconv library version 1.8

xml
XML Support active
XML Namespace Support active
EXPAT Version 1.95.2

xslt
XSLT support enabled
Backend Sablotron
Sablotron Version 0.97
Sablotron Information Cflags: -g -O2 -I/usr/local/expat_new/include -I/usr/local/include Libs: -L/usr/local/sablot_new/lib -liconv -lexpat Prefix: /usr/local/sablot_new


Мой документ:
<?xml version='1.0' encoding='кодировка1'?>
<xsl:stylesheet version="1.0" xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<!--xsl:output method="html" indent='no'/-->
<xsl:output method="text" indent='yes' encoding="кодировка2"/>

На месте кодировки1 подходит: windows-1250, UTF-8, ISO-8859-1, ISO-8859-2, ISO-8859-3. На месте кодировки2 не подходит вообще ничего, кроме UTF-8 (или удаления этого параметра).

Пробовал искать по диску файлы, в которых упоминается
'windows-1250', но не упоминается 'windows-1251'. Особо это ничего не дало (в саблатроне только 'windows-1250' есть, а iconv сам по себе отлично работает).
 
Попробуй, эаработает у тебя такой пример:
http://dan.phpclub.net/sablot/index.php

сырцы:
http://dan.phpclub.net/sablot/index.phps
http://dan.phpclub.net/sablot/yyy.xml
http://dan.phpclub.net/sablot/yyy.xsl

Должно выдать qwe qwe qwe qwe в браузере.
У меня этот пример работает везде (и под ХР, и на сервере клуба).

Pphinfo под ХР:

iconv
iconv support enabled
iconv implementation libiconv
iconv library version 1.8

xml
XML Support active
XML Namespace Support active
EXPAT Version 1.95.2

xslt
XSLT support enabled
Backend Sablotron
Sablotron Version 0.97
 
Warning: Sablotron error on line 1: XML parser error 2: syntax error in xmltest.php on line 14 (строка с $result = xslt_process). Пробовал заменить 'windows-1251' на 'UTF-8', по прежнему ошибка синтаксиса на строке 1, т.е. проблема даже не в кодировке.
 
Если syntax error, то возможно сами документы не well-formed.

попробуй с теми файлами, которые я выложил у себя на сайте.
 
Что это значит? Я скачал указанные файлы wget'ом. Если сомневаешься, что я криво скачал - могу запаковать и прислать обратно...
 
Воспользовался способом ручной перекодировки: во все ХМЛ файлы записал кодировку UTF-8, текст в них по прежнему на русском (в кирилице).

$filexsl=iconv("ISO-8859-1","UTF-8",$filexsl);
$arguments = array('/_xml' => $filexml, '/_xsl' => $filexsl);
$xh=xslt_create();
$out=xslt_process($xh, 'arg:/_xml', 'arg:/_xsl', NULL, $arguments);
$out=iconv("UTF-8","ISO-8859-1",$out);
$out=preg_replace("!content=\"text/html; charset=UTF-8\"!i","content=\"text/html; charset=windows-1251\"",$out,1);
 
Сверху