Проблема с кодировкой при выводе сайта в XSL шаблоне или почему нельзя вставлять текст на сайт из Word’а

Если при проектировании нового сайта вы решили отказаться от популярных монстров шаблонизации типа Smarty в сторону «нативного» php-шного шаблонизатора на XSLT, то вполне возможно (по незнанию или чистой случайности) могли оказаться в моей ситуации.

Я как раз переделывал мой старенький сайт с книжками agorod.org.ua с использованием XML и XSL шаблонизации, когда часть старого текста, который отлично выводился в XHTML Transitional вдруг начал выдавать ошибки парсинга xml:

Message: simplexml_load_string(): Entity: line 3: parser error : Input is not proper UTF-8, indicate encoding ! Bytes: 0xAB 0x2E 0x2E 0x2E

XSLTProcessor::transformToXml(): Invalid Document

Решение оказалось простым до безобразия.

Кстати сказать текст как и раньше, так и теперь, для xml версии был и остался в utf-8, в mysql, в apache и в конечном выводе.

К сожалению особо ничего по этому поводу в сети нарыть не нашлось, хотя жалобы на то, что такие ошибки выползают на популярных движках (я встречал про wordpress и hostcms) после вставки текста из ms word’а имелись (хотя думаю относительно openoffice/libreoffice это скорее всего тоже справедливо).

Были решения типа конвертации сомнительного текста в utf-8. Хотя у меня все было в utf-8, я все равно попытался, но это не возымело успеха:

       $text = utf8_encode($text);
       $text = mb_convert_encoding($text, 'UTF-8');
       $text = iconv("UTF-8","UTF-8//IGNORE", $text);

Вобщем-то, если бы не природная лень, я бы разобрался с проблемой быстрее, достаточно было взглянуть туда, куда ругается парсер, чтобы выяснить необычный символ.

Предательскими символами оказались кавычки, вставленные из текстового процессора:

« // была заменена на "
» // была заменена на "
… // тоже заменил, чтобы "два раза не бегать" на простые три точки.

Ни первых двух кавычек, ни троеточия, ни их html-алиасов в мнемониках xml нет (по крайней мере согласно этой странице их пять: Мнемоники XML )

В общем имейте в виду и держите ухо востро.

Полезно(0)Бесполезно(0)

Добавить комментарий