php XML-экспорт с XMLWriter с использованием метода writeAttribute ()

Я экспортирую данные таблицы в xml, который содержит многоязычный контент в столбце контента с сочетанием html, например

$xmlWriter->writeAttribute('value', $contents);

запись:

 name="testing" , contents="Just <span style="color:red">testing</span>:漢字" 

Экспортируется как:

<entry key="testing" value="Just &lt;span style='color:red'&gt;testing&lt;/span&gt;:漢字">

Ожидаемое:

<entry key="testing" value="Just &lt;span style='color:red'&gt;testing&lt;/span&gt;:漢字">

Я не хочу, чтобы xml писатель кодировал многоязычные символы, как это возможно?

    Я не хочу, чтобы xml писатель кодировал многоязычные символы, как это возможно?

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

    Чтобы не использовать числовые объекты, вам необходимо сопоставить кодировку документа с кодировкой вашей строки. Из предоставленного вами результата я могу только немного догадаться, эти два символа, вероятно, означают:

    1. Unicode Han Character «Китайский народ, китайский язык» (U + 6F22)
    2. Unicode Han Character «письмо, символ, слово» (U + 5B57)

    Это может означать (пока я не говорю по-китайски), что-то вроде китайского слова .

    XMLWriter в PHP всегда будет помещать символы в числовой объект (например, &#x6F22; и &#x5B57; в вашем примере), когда кодировка документа не может представлять этот символ внутри документа.

    Если вы можете сопоставлять оба кодирования, XMLWriter автоматически не будет использовать числовые объекты.

    Я приведу более простой пример. Давайте возьмем кодировку US-ASCII и немецкий умляут Ä из Äpfel ( символ Юникода «LATIN CAPITAL LETTER A WITH DIAERESIS» (U + 00C4) ) в качестве значения атрибута:

     <?php $xmlWriter = new XMLWriter(); $xmlWriter->openMemory(); $xmlWriter->startDocument('1.0', 'US-ASCII'); $xmlWriter->startElement('root'); $xmlWriter->writeAttribute('value', 'Äpfel'); $xmlWriter->endDocument(); echo $xmlWriter->flush(); 

    Этот код, записанный в файле PHP с кодировкой UTF-8, будет выводиться при выполнении:

     <?xml version="1.0" encoding="US-ASCII"?> <root value="&#196;pfel"/> 

    &#196; является числовым объектом для символа Юникода U + 00C4, и если вы внимательно посмотрите, C4 представляет собой шестнадцатеричное представление десятичного числа 196, которое также показывает, что числовой объект XML всегда представляет собой номер символа Юникода.

    Таким образом, вывод XML использует кодировку US-ASCII, которая не может представлять Ä из кодированной в UTF-8 строки в PHP-коде и поэтому правильно кодирует ее с помощью числового объекта для сохранения символьной информации.

    Теперь изменим кодировку:

     $xmlWriter->startDocument('1.0', 'US-ASCII'); 

    к кодировке UTF-8 строки PHP:

     $xmlWriter->startDocument('1.0', 'UTF-8'); 

    меняет этот вывод:

     <?xml version="1.0" encoding="UTF-8"?> <root value="Äpfel"/> 

    Тем не менее, это будет одинаково работать с вашим примером, но одна важная информация в вашем вопросе отсутствует: в которой кодировка является строкой из этой записи?

    Если это уже UTF-8, то, как я описал в приведенном выше примере, это уже сработало:

     <?php $recordUTf8 = "... contents=\"Just <span style=\"color:red\">testing</span>:" ."\xE6\xBC\xA2\xE5\xAD\x97\""; $encoding = 'UTF-8'; $encoding = 'US-ASCII'; $xmlWriter = new XMLWriter(); $xmlWriter->openMemory(); $xmlWriter->startDocument('1.0', $encoding); $xmlWriter->startElement('record'); $xmlWriter->writeAttribute('value', $recordUTf8); $xmlWriter->endDocument(); echo $xmlWriter->flush(); 

    Вывод:

     <?xml version="1.0" encoding="UTF-8"?> <record value="... contents=&quot;Just &lt;span style=&quot;color:red&quot;&gt; testing &lt;/span&gt;:漢字 &quot;"/> 

    Как видно из этого вывода, здесь не используются числовые сущности, однако строка явно кодируется UTF-8 (в двоичной безопасной форме здесь, если вы используете другую кодировку для файла PHP, если вы ее скопируете).

    Итак, просто подведем итог: XML-кодировка должна соответствовать кодировке строки для представления всех символов не в числовых сущностях (кроме тех, которые используются для кодирования самого XML, например < , > , ' , " и & ).

    Это в значительной степени основы XML. Если документ имеет кодировку, символьные данные не могут быть представлены, но поскольку XML поддерживает Unicode, резервное копирование представляет собой числовые объекты. Вы пытаетесь предотвратить этот резерв, выровняв кодировку документа со строковой кодировкой.

    Вот мой совет для PHP & XMLWriter:

    1. Получить или перекодировать запись из базы данных в UTF-8.
    2. Только передайте строки UTF-8 в методы XMLWriter .
    3. Установите кодировку документов XML в UTF-8.

    Я даю эти предложения, потому что UTF-8 является кодировкой по умолчанию для поддержки XML и UTF-8. Также XMLWriter ожидает, что строки Unicode будут закодированы в кодировке UTF-8, нет настроек или параметров, которые позволят вам изменить это, поэтому вход уже должен быть закодирован в кодировке UTF-8.

    Независимо от входной строки, вы можете, естественно, сказать, что XMLWriter использует другую выходную кодировку. Например, любое другое китайское кодирование или кодировка Юникода может вам пригодиться, и это возможно для вывода XMLWriter до тех пор, пока ваша конфигурация PHP поддерживает эту конкретную выходную кодировку ( проверьте библиотеку iconv, которую у вас есть).

    Когда вы начинаете документ с XMLWriter, второй параметр указывает кодировку:

     $xmlWriter->startDocument('1.0', $encoding); 

    Вы можете поместить любую кодировку из набора поддерживаемых XML-кодировок в соответствующую XML-декларацию:

     <?xml version="1.0" encoding="ISO-8859-1"?><!-- Latin-1 example --> 

    Полные спецификации значения кодировки XML можно найти здесь: http://www.w3.org/TR/REC-xml/#NT-EncName ::

    В объявлении кодирования значения « UTF-8 », « UTF-16 », « ISO-10646-UCS-2 » и « ISO-10646-UCS-4 » должны использоваться для различных кодировок и преобразований Unicode / ISO / IEC 10646, значения « ISO-8859-1 », « ISO-8859-2 », … « ISO-8859- n» (где n – номер детали) должны использоваться для частей ISO 8859, а для различных кодированных форм JIS X-0208-1997 должны использоваться значения « ISO-2022-JP », « Shift_JIS » и « EUC-JP ». Рекомендуется, чтобы кодировки символов, зарегистрированные (как кодировки) с полномочиями назначенных номеров Интернета [IANA-CHARSETS], кроме перечисленных только, были направлены на использование их зарегистрированных имен; другие кодировки должны использовать имена, начинающиеся с префикса «x-». XML-процессоры должны соответствовать именам кодировки символов нечувствительным к регистру образом и должны либо интерпретировать зарегистрированное IANA имя как кодировку, зарегистрированную в IANA для этого имени, либо рассматривать ее как неизвестную (процессоры, конечно же, не обязательны для поддержки всех IANA- зарегистрированные кодировки).

    Где-то [IANA-CHARSETS]:

    (Авторитет интернет-назначенных номеров) Официальные имена для наборов символов , изд. Keld Simonsen et al. (См. http://www.iana.org/assignments/character-sets .)

    Эти спецификации, возможно, немного многословны. В контексте вашего вопроса все, что вам нужно сделать, это выяснить кодировку вашей строки записи. Я кстати. не могу сказать, что я не смог воспроизвести ваш точный результат, я всегда получаю десятичные сущности, а не гекса-десятичные. Возможно, вы сможете предоставить дополнительную информацию с шестнадцатеричным дампом строки .