Кривые символы

Одессит

Новичок
Возникла проблема при создании XML с определенными символами, которые вытворяют мистические вещи, просто съедают строки XML
PHP:
urldecode('%1b%5bA%1b%5bA%1b%5bD.')
То есть у меня код
PHP:
echo '
            <sphinx:document id="' . $row['id'] . '">
                <extension><![CDATA[' . htmlspecialchars($row['extension']) . ']]></extension>
                <size>' . $row['size'] . '</size>
                <type><![CDATA[' . htmlspecialchars($row['type']) . ']]></type>
                <test><![CDATA[' . urldecode('%1b%5bA%1b%5bA%1b%5bD.') . ']]></test>
            </sphinx:document>';
На выходе
<sphinx:document id="100000">
<extension><![CDATA[jpg]]></extension>
<size>4541</si.]]></test>
</sphinx:document>
Вопрос заключается как вырезать такие символы, при этом нужно символы кодировки UTF8 оставить, которые не ломают XML
 

fixxxer

К.О.
Партнер клуба
Никто ничего не ломает, это ansi escape-последовательности, управляющие выводом в консоль, сфинксу они ничем не помешают. С точки зрения utf-8 все валидно. Вот htmlspecialchars ты делаешь при выводе html, а в unix-консоль тоже при выводе ескейпить надо в соответствии с типом терминала ;)
 

Одессит

Новичок
Никто ничего не ломает, это ansi escape-последовательности, управляющие выводом в консоль, сфинксу они ничем не помешают. С точки зрения utf-8 все валидно. Вот htmlspecialchars ты делаешь при выводе html, а в unix-консоль тоже при выводе ескейпить надо в соответствии с типом терминала ;)
Ну, ситуация такая, я запускаю индексацию сфинкса, но она завершается ошибкой
ERROR: index 'files_info_catalogsearch_7': source 'files_info_catalogsearch_7': XML parse error: not well-formed (invalid token) (line=157130, pos=31, docid=100000).
Вывел в файл XML, посмотрел что там выдает в той строке (он битый как показал выше), нашёл какой символ его ломает.
Вопрос, что мне добавить в код или куда либо ещё, чтобы такой ошибки при индексации не было? Какой вариант кроме как вырезания таких символов может ещё быть? Может если бы у меня не через XML шла индексация, а на прямую с базы, то оно и не падало, а так падает.
 

Sufir

Я не волшебник, я только учусь
Попробуй формировать XML при помощи SimpleXML или DOM.
 

Одессит

Новичок
Символ всё равно остаётся, а именно из-за этого и падает
PHP:
$dom = new DOMDocument('1.0', 'utf-8');
$element = $dom->createElement('test');
$element->appendChild($dom->createCDATASection(urldecode('%1b')));
$dom->appendChild($element);
echo $dom->saveXML();
<?xml version="1.0" encoding="utf-8"?>
<test><![CDATA[ESC]]></test>


ESC - это мне Notepad++ показал что это за символ такой

Так что попробую просто добавить preg_replace с какими-то параметрами
 

fixxxer

К.О.
Партнер клуба
Просто заменяй все символы от \x00 до \x19 на пробел.
Не помешает еще обеспечить валидность utf8, раз у тебя источник данных содержит всякое г.

как-то так
PHP:
return mb_convert_encoding(preg_replace("/[\\x00-\\x19]/", ' ', $value),  'UTF-8', 'UTF-8');
 
Сверху