У меня есть файл PHP, который создает карту сайта Xml на основе данных, которые были импортированы из нескольких источников. В настоящее время моя карта сайта плохо сформирована из-за незаконного символа в одной строке импортированных данных, однако я изо всех сил пытаюсь ее удалить.
Символ выглядит как «квадрат» или верхний индекс 2 и представлен как квадрат. Я попытался вставить это в шестнадцатеричный редактор, но он отображается как?, А шестнадцатеричный код также соответствует?. Я также попытался использовать iconv для преобразования из всех кодировок источника во все кодировки назначения, без комбинации, удаляющей этот символ.
У меня также есть следующая функция для удаления символов, отличных от ascii:
function stripInvalidXml($value) { $ret = ""; $current; if (empty($value)) { return $ret; } $length = strlen($value); for ($i=0; $i < $length; $i++) { $current = ord($value{$i}); if (($current == 0x9) || ($current == 0xA) || ($current == 0xD) || (($current >= 0x20) && ($current <= 0xD7FF)) || (($current >= 0xE000) && ($current <= 0xFFFD)) || (($current >= 0x10000) && ($current <= 0x10FFFF))) { if($current != 0x1F) { $ret .= chr($current); } } else { $ret .= " "; } } return $ret; }
Однако это еще не удаляет его. Если я пройду через код, незаконный символ будет расширен до в окне отладки затмений. Строка, с которой возникают проблемы, ниже (надеясь, что она правильно встанет)
251gm-50
Любые идеи о функции, которые удаляют этот символ и предотвращают появление этой формы, очень ценятся – у меня мало контроля над импортируемыми данными, поэтому это нужно делать в точке генерации Xml.
РЕДАКТИРОВАТЬ
После публикации я вижу, что символ отображается неправильно. При просмотре в окне Eclipses оно отображается как & # 65535; (без пробелов – если я оставляю пробелы в нем, отображается символ, который выглядит как )
Вы пытаетесь выполнить перекодировку символов. Не делайте этого самостоятельно, используйте библиотеку PHP.
Я нашел iconv
весьма полезным:
$cleanText = iconv('UTF-8','ISO-8859-1//TRANSLIT//IGNORE', $srcText);
Этот код переводится с utf-8 на iso-8859, пытаясь переназначить «экзотические» символы и игнорировать те, которые невозможно перекодировать.
Я просто предполагаю, что исходная кодировка – utf-8. Вам нужно выяснить, какая кодировка входящих данных использует и переводит в том, что вы декларируете в заголовке XML.
Инструмент командной строки linux, предполагающий кодировку файла, является enca
Это не верно:
$current = ord($value{$i}); if (($current == 0x9) || ($current == 0xA) || ($current == 0xD) || (($current >= 0x20) && ($current <= 0xD7FF)) || (($current >= 0xE000) && ($current <= 0xFFFD)) || (($current >= 0x10000) && ($current <= 0x10FFFF))) { if($current != 0x1F) $ret .= chr($current); }
ord()
никогда не возвращает ничего больше, чем 0xFF, поскольку она работает побайтно.
Я предполагаю, что ваш XML недопустим, потому что файл содержит недопустимую последовательность UTF-8 (действительно, # 65535 ;, то есть 0xFFFF, является недопустимым в UTF-8). Вероятно, это происходит из копий разных файлов XML, которые имеют разные кодировки.
Я предлагаю вам вместо этого использовать расширение DOM, чтобы сделать ваш XML-mash-up, который автоматически обрабатывает различные кодировки, преобразовывая их внутри в UTF-8.
Я думаю, что я искал неправильный путь – вместо символа проблемы кодирования был объект HTML, представляющий символ «квадрат». Поскольку описания в URL-адресе существуют только для целей поиска, я могу безопасно удалить все htmlentities со следующим регулярным выражением:
$content = preg_replace("/&#?[a-z0-9]+;/i","",$content);