Декодировать символы в кодировке HTML с помощью расширенного ASCII

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

Например:

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

Пробовал почти все от iconv до mb_decode_numericentity - ничего не получилось.

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

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


person Swissdude    schedule 26.10.2015    source источник
comment
Учитывая ваш пример, что š должен декодировать в š, вы используете не кодировку utf-8, а какой-то iso. Лично я бы переключился на utf-8, но это не главное. Я предполагаю, что вам нужно указать html_entity_decode() придерживаться вашей любимой кодировки вместо использования значения по умолчанию, как указано в php.ini.   -  person Karel Kubat    schedule 26.10.2015
comment
Спасибо, Карел. На самом деле я пробовал это, используя все кодировки, поддерживаемые html_entity_decode(), но ни один из них не работал :(   -  person Swissdude    schedule 26.10.2015
comment
Звучит как нестандартное и/или, возможно, устаревшее использование объектов HTML. Не уверен, что любая стандартная функция PHP может справиться с этим. Возможно, вам придется написать пользовательскую функцию preg_replace_callback или аналогичную, которая декодирует эти конкретные кодовые точки.   -  person deceze♦    schedule 26.10.2015
comment
Это точно не стандарт. XML предоставляется какой-то сторонней компанией. Я понятия не имею, почему они это делают. Интересно, что когда я добавляю «š» в поле поиска Google, он переводит его в š — так что, если они могут это сделать, почему я не могу? ;)   -  person Swissdude    schedule 26.10.2015


Ответы (1)


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

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

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

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

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

person Álvaro González    schedule 26.10.2015
comment
Спасибо Альваро. Но он обязательно должен преобразоваться в первый (š), поскольку он является частью имени с этим символом. Как я уже упоминал в своем редактировании, я обнаружил, что š является частью ASCII-таблицы Windows-1252. Но даже когда я пытаюсь выполнить html_entity_decode('š', ENT_COMPAT, 'Windows-1252'), я получаю пустой вывод. - person Swissdude; 26.10.2015
comment
Вы не можете выбрать кодировку объектов XML. Как бы то ни было, не доверяйте визуализированным персонажам; вместо этого используйте шестнадцатеричный редактор или распечатайте данные через bin2hex() (если вы этого не сделали). - person Álvaro González; 26.10.2015