2013-09-19 2 views
1

Я экспортирует данные таблицы в XML, который содержит следующее содержание в колонке контента с соединением HTML, напримерPHP вопрос экспорта XML с XMLWriter использованием writeAttribute() метод

$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;:&#x6F22;&#x5B57;">

Ожидаемое:

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

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

+0

Невозможно воспроизвести вашу проблему - http://3v4l.org/n7Dni – CBroe

+0

Я могу частично воспроизвести проблему, но в конце концов вопрос не содержит достаточной информации, чтобы сказать конкретно, поэтому я мог бы просто ответить на все вопросы, как это работает: http://stackoverflow.com/a/18891201/367456 – hakre

+0

@hakre, @ CBroe на самом деле я пропустил добавить '$ xmlWriter-> startDocument ('1.0', 'UTF-8');' после добавления исправленной проблемы, спасибо всем за ваше время – sakhunzai

ответ

1

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

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

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

  1. Unicode Han Character 'the Chinese people, Chinese language' (U+6F22)
  2. Unicode Han Character 'letter, character, word' (U+5B57)

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

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

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

Приведу более простой пример. Давайте возьмем US-ASCII кодирования и немецкий умляут Ä от Apfel (Unicode Character '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(); 

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

<?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"/> 

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

Если это 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 использует другую выходную кодировку. Например, любое другое китайское кодирование или кодировка Unicode может быть вам подходит, и вы можете получить XMLWriter до тех пор, пока ваша конфигурация PHP поддерживает эту специфическую кодировку вывода (check the iconv library у вас есть).

При запуске документа с 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, а значения "ISO-2022-JP", "Shift_JIS" и "EUC-JP" должны использоваться для различных кодированных форм JIS X-0208-1997. Рекомендуется, чтобы кодировки символов, зарегистрированные (как кодировки) с полномочиями назначенных номеров Интернета [IANA-CHARSETS], кроме перечисленных только, были направлены на использование их зарегистрированных имен; другие кодировки должны использовать имена, начинающиеся с префикса «x-». XML-процессоры должны соответствовать именам кодировки символов нечувствительным к регистру образом и должны либо интерпретировать зарегистрированное IANA имя как кодировку, зарегистрированную в IANA для этого имени, либо рассматривать ее как неизвестную (процессоры, конечно же, не обязательны для поддержки всех IANA- зарегистрированные кодировки).

Где-а [IANA-CHARSETS] является:

(Internet Assigned Numbers Authority) Official Names for Character Sets, изд. Keld Simonsen et al. (См. http://www.iana.org/assignments/character-sets.)

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

+0

спасибо '$ xmlWriter-> startDocument ('1.0', $ encoding);' работал для меня – sakhunzai

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