2015-10-01 6 views
0

Я добавляю содержимое в документ XML с помощью PHP File_Put_Contents, а затем я использую Microsoft Word для открытия этого документа. Проблема заключается в том, если добавить символ валюты евро (), затем прорывается документ, я получаю следующее сообщение об ошибке:Символ евро валюты нарушает XML-документ

enter image description here

+0

так что вы говорите, если пользователь вводит '' € в качестве входных данных, мне нужно заменить его '' €? –

+0

'€' не является допустимым объектом XML, если не определено. Он доступен в (X) HTML, и вы можете определить его для своего XML. По умолчанию он недоступен в XML. – ThW

ответ

3

€ не является допустимым XML-объект.

Попытка решить проблемы с кодированием с помощью объектов - это плохая практика. Вместо этого убедитесь, что все ваши строки соответствуют UTF-8.

-2

вы пытались использовали "€? И убедитесь, что вы очистить вашу строку с помощью отрезала ниже:

$currentString = preg_replace("[^!-~ ]", '', $currentString); 
+0

@Reagan Gallant, как вы добавляете € ??? В моем ответе он отображает символ евро. – qtran

3

Сначала убедитесь, что ваши строки имеют UTF-8. Методы и функции в PHP будут ожидать, что UTF-8 будет независим от вывода. Можно работать с другими наборами символов/кодировками, но это действительно сложно.

Если вы создаете XML с использованием XML-API, такого как DOM или XMLWriter, он позаботится о кодировке по мере необходимости. В XML-документе UTF-8 код не требуется кодировать.

$document = new DOMDocument('1.0', 'UTF-8'); 
$document 
    ->appendChild($document->createElement('price')) 
    ->appendChild($document->createTextNode('€ 42.00')); 

echo $document->saveXml(); 

Выход:

<?xml version="1.0" encoding="UTF-8"?> 
<price>€ 42.00</price> 

Однако в документе ASCII XML должен специальный символ, который будет закодирован в виде числового объекта. Именованные объекты, такие как &euro;, не будут работать. Они специфичны для (X) HTML, а не для XML.

$document = new DOMDocument('1.0', 'ASCII'); 
$document 
    ->appendChild($document->createElement('price')) 
    ->appendChild($document->createTextNode('€ 42.00')); 

echo $document->saveXml(); 

Выход:

<?xml version="1.0" encoding="ASCII"?> 
<price>&#8364; 42.00</price> 

То же самое можно с XMLWriter:

$writer = new XMLWriter(); 
$writer->openMemory(); 
$writer->startDocument('1.0', 'ASCII'); 
$writer->writeElement("price", '€ 42.00'); 
$writer->endDocument(); 
echo $writer->outputMemory(); 

Если вы генерировать XML в виде текста (как правило, не лучший выбор), вам придется принять по уходу за кодированием самостоятельно:

echo '<?xml version="1.0" encoding="UTF-8"?>', "\n"; 
printf('<price>%s</price>', htmlentities('€ 42.00', ENT_XML1 | ENT_COMPAT, "UTF-8")); 

Выход:

<?xml version="1.0" encoding="UTF-8"?> 
<price>€ 42.00</price> 
+0

Я генерирую XML как текст, я пробовал использовать 'htmlentities', он печатает черное пространство –

+0

Вы уверены, что ваш ввод действительно UTF-8? Если это какая-то другая кодировка/символ, клиент чтения получит несколько разных байтов, которые он не может понять. – ThW

+0

вы имеете в виду это '' ?, yes i do have –

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