2015-10-26 2 views
3

У меня есть XML со специальными символами, закодированными как & #xxx; в этом. Пока я выводил эти символы в браузер, это было бы прекрасно, поскольку они были HTML-кодировками (вроде). Но мне нужно прочитать XML-файл с simplexml_load_string, что приводит к мусору для определенных символов, поскольку они находятся в расширенной таблице ASCII.Декодирование символов HTML с расширенным ASCII

Например:

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

Я пробовал почти все: от iconv до mb_decode_numericentity - ничего не работало.

Как их преобразовать & #xxx; к реальным персонажам ???

[Редактировать] Я нашел эту таблицу http://www.ascii-code.com что утверждает š является расширенной ASCII символов с помощью ISO-8859-1 Я запутался ...

+0

Учитывая ваш пример, что š должен декодировать в š, вы не используете кодировку utf-8, но некоторые iso. Лично я бы переключился на utf-8, но это к тому же. Я предполагаю, что вам нужно указать html_entity_decode(), чтобы придерживаться вашей любимой кодировки вместо того, чтобы принимать значение по умолчанию, указанное в php.ini. –

+0

Спасибо Karel - я действительно пробовал это, используя каждую кодировку, поддерживаемую html_entity_decode(), но никто из них не работал :( – Swissdude

+0

Звучит как нестандартное и/или возможно устаревшее использование объектов HTML.Не уверен, что любая стандартная функция PHP может справиться с этим. Возможно, вам нужно написать пользовательскую функцию 'preg_replace_callback' или аналогичную, которая декодирует эти конкретные кодовые точки. – deceze

ответ

1

Вы, очевидно, имеем дело с двумя разными персонажами, которые выглядят практически одинаково при печати:

Я обнаружил, что ни один из моих шрифтов или текстовых редакторов не справляется со вторым. Таким образом, вы, скорее всего, получите чистый символ по этой точной причине.

Второй, кажется, своего рода weird control character, точное назначение ускользает от моего понимания:

Чтобы следовать одной печатаемые символы (0x20 через 0x7E) или формате эффектора (0x08 через 0x0D) , Цель состояла в том, чтобы предоставить средство , с помощью которого может быть определена функция управления или графический символ, который был бы независимо от того, какие графические или контрольные наборы были использованы . Определения того, что будет вызывать следующий байт , никогда не были реализованы в международном стандарте. Не часть первого издания ISO/IEC 6429

Стоит отметить, что character references in XML использовать числовые коды из фиксированного кодирования (некоторые UCS вариант). Если автор XML-файла не придерживается этого соглашения, вы столкнетесь с недействительным XML (что бы эффективно мешало ему разбираться с XML-библиотекой) или действительным XML, который содержит поврежденные данные (что, потребует утомительной постобработки).

+0

Спасибо Álvaro. Но он должен обязательно преобразовать в первый (š), поскольку он является частью имени с этим символом. Как я уже упоминал в своем редактировании, я узнал, что š является частью ASCII-таблицы windows-1252. Но даже когда я пытаюсь html_entity_decode ('š', ENT_COMPAT, 'Windows-1252'), я получаю пустой вывод. – Swissdude

+0

[Вы не можете выбрать кодировку объектов XML] (http://www.w3.org/TR/REC-xml/#dt-charref). Что бы то ни было, не доверяйте отображаемым символам; используйте шестнадцатеричный редактор или распечатайте данные через bin2hex() вместо этого (если вы этого не сделали). –

Смежные вопросы