欧元货币符号打破XML文档

时间:2015-10-01 13:31:17

标签: php xml special-characters

我正在使用PHP File_Put_Contents向XML文档添加内容,然后我使用Microsoft Word打开该文档。问题是,如果我添加欧元货币符号(),那么文档中断,我收到以下错误:

enter image description here

3 个答案:

答案 0 :(得分:3)

€不是有效的XML实体。

尝试解决实体的编码问题是一种不好的做法。相反,请确保所有字符串都是正确的UTF-8。

答案 1 :(得分:3)

首先确保你的字符串实际上是UTF-8。 PHP中的方法和函数将期望它作为UTF-8独立于输出。可以使用其他字符集/编码,但这非常复杂。

如果使用DOM或XMLWriter等XML API创建XML,则会根据需要处理编码。在UTF-8 XML文档中,不需要编码。

$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>

答案 2 :(得分:-2)

你试过用'€'吗?并确保使用下面的剪辑清理你的字符串:

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