Кодировка UTF-8 для XML с символами php и accent вместе с ENT_XML1

Постоянная проблема в течение года, которую я исправил, но превратился в монстра.

Я перемещаю большие объемы данных между сайтами, используя XML, сгенерированный в системах PHP. В основном текст Я столкнулся с некоторыми базовыми элементами XML, которые прервали передачу, поэтому я использовал этот код всех значений XML.

$value=str_replace("'","'",$value);
print '<'.$key.'>';
print htmlspecialchars($value, ENT_XML1 | ENT_QUOTES, 'UTF-8');
print '</'.$key.'>';

Поле $ key является полем, и оно отлично работает для всех данных, за исключением любого текста, содержащего акцент, например, пиньята. Значение с символом ñ отображается как полностью пустое.

Мне еще предстоит найти функцию для очистки текста для форматирования XML с помощью PHP. В настоящее время я выгружаю данные из базы данных в этот формат, затем загружаю в SImpleXML на принимающей стороне, чтобы загрузить обратно в базу данных.

Решение путем очистки всех данных или, возможно, кодировки JSON вместо XML, возможно, будет фантастическим.

Спасибо, Крис

1

Решение

Для моего примера, даже если все мои таблицы установлены в UTF-8, при построении моего XML я должен установить значения в UTF-8

$value=str_replace("'","&#039;",$value);
print '<'.$key.'>';
$value = utf8_encode($value);
print htmlspecialchars($value, ENT_XML1 | ENT_QUOTES, 'UTF-8');
print '</'.$key.'>';

Не уверен, когда кодирование изменяется между чтением из таблицы и размещением, но это дало мне требуемые результаты. Я не думаю, что BASE64 со специальными символами является жизнеспособным.

0

Другие решения

Если вы используете XML Api (DOM, XMLReader), он позаботится о проблемах кодирования значений / текстового содержимого. Однако имена тегов — это другая проблема. Вам нужно будет создать нормализованное имя тега или использовать фиксированное имя тега. Затем сохраните исходное имя поля в качестве значения атрибута.

Например с фиксированным именем тега field:

<records>
<record>
<field name="some field">some content</field>
</record>
</records>

Это более чистый вариант, поскольку здесь нет динамических имен тегов, вы можете создать схему / DTD и проверить XML.

Или нормализованная версия имени поля:

<records>
<record>
<some-field>some content</some-field>
</record>
</records>

Это часто используется как общий способ сериализации структуры данных в виде XML. Это только правильно сформированный XML, вы не можете определить схему / XSD, потому что имена тегов зависят от данных.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector