Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-DOM类编号实体和编码问题_Php_Dom_Encoding_Utf 8_Entities - Fatal编程技术网

PHP-DOM类编号实体和编码问题

PHP-DOM类编号实体和编码问题,php,dom,encoding,utf-8,entities,Php,Dom,Encoding,Utf 8,Entities,我在使用PHP DOM类时遇到了一些困难 我正在制作一个站点地图脚本,我需要$doc->saveXML()的输出 <?xml version="1.0" encoding="UTF-8"?> <root> <url> <loc>http://www.somesite.com/servi&#xE7;os/redesign</loc> </url> </root> http

我在使用PHP DOM类时遇到了一些困难

我正在制作一个站点地图脚本,我需要$doc->saveXML()的输出

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <url>
        <loc>http://www.somesite.com/servi&#xE7;os/redesign</loc>
    </url>
</root>

http://www.somesite.com/serviç操作系统/重新设计


http://www.somesite.com/serviç操作系统/重新设计
但我得到了:

<?xml version="1.0" encoding="UTF-8"?>
<root>
    <url>
        <loc>http://www.somesite.com/servi&amp;#xE7;os/redesign</loc>
    </url>
</root>

http://www.somesite.com/servi&#xE7;操作系统/重新设计
这是我可以得到的壁橱,使用名为to numbered entities的replace函数

我也能复制

<?xml version="1.0" ?>
<root>
    <url>
        <loc>http://www.somesite.com/servi&amp;#xE7;os/redesign</loc>
    </url>
</root>

http://www.somesite.com/servi&#xE7;操作系统/重新设计
但是没有指定编码

最好的解决方案(我认为编写代码的方式)是:

<?php
$myArray = array();
// do some stuff to populate the with URL strings

$doc = new DOMDocument('1.0', 'UTF-8');

// here we modify some property. Maybe is the answer I am looking for...

$urlset = doc->createElement("urlset");
$urlset = $doc->appendChild($urlset);

foreach($myArray as $address) {
    $url = $doc->createElement("url");
    $url = $urlset->appendChild($url);

    $loc = $doc->createElement("loc");
    $loc = $url->appendChild($loc);

    $valueContent = $doc->createTextNode($value);
    $valueContent = $loc->appendChild($address);
}

echo $doc->saveXML();
?>

注:

  • 服务器响应头包含UTF-8字符集
  • PHP脚本保存在UTF-8中
  • 读取的URL是UTF-8字符串
  • 上面的脚本包含DOMDocument构造函数上的编码声明,并且不使用任何转换函数,如htmlentities、urlencode、utf8_encode
我已尝试更改DOMDocument属性DOMDocument:$resolveExternals和DOMDocument:$substituteEntities值。没有一种组合起作用

是的,我知道我可以在不指定DOMDocument构造函数上的字符集的情况下完成所有过程,将字符串内容转储到变量中,并使用字符串替换函数进行非常简单的字符串替换。这很有效。但我想知道我在哪里滑倒,如何使用本机API和设置来实现这一点,或者即使这是可能的


提前感谢。

在将实体传递给createTextNode之前对其进行解码

$valueContent = $doc->createTextNode(html_entity_decode($value, ENT_QUOTES, 'UTF-8'));

那是因为ç;不是UTF-8文档中的有效实体。因此DomDocument将&视为,并将其编码为&

resolveExternals
substituteEntity
是解析器的特性。它们对序列化没有影响

XML信息集对以下内容没有任何区别:

<loc>http://www.somesite.com/serviços/redesign</loc>
<loc>http://www.somesite.com/servi&#xE7;os/redesign</loc>
<loc>http://www.somesite.com/servi&#231;os/redesign</loc>
结果:

<?xml version="1.0" encoding="US-ASCII"?>
<loc>servi&#231;os</loc>

例如,
rawurlencode('serviços')

感谢您的评论和回复。在深入阅读站点地图协议规范以及RFC之后,我找到了一个解决方案。我正在使用urlencode函数处理URL条目。我意识到的一件事是PHP的内置urlencode函数主要基于RFC1738。当前URL RFC为3986。这是我将URL正确转换为百分比实体的函数。函数myUrlEncode($string){$entities=array('%21','%2A','%27','%28','%29','%3B','%3A','%40','%26','%3D','%2B','%24','%2C','%2F','%3F','%25','%23','%5B','%5D');$replacements=array('!',''''*','''',''''',''''','''','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','',“%”,“#”,“[”,“]”;返回str_replace($entities,$replacements,urlencode($string));}感谢您的输入和说明。这并不完全是我所寻求的解决方案,但它帮助我走上了正确的道路。
$s= "serviços"; // or "\xC3\xA7" if you can't input UTF-8 strings directly

$doc = new DOMDocument('1.0', 'US-ASCII');
$doc->appendChild($loc= $doc->createElement('loc'));
$loc->appendChild($doc->createTextNode($s));
echo $doc->saveXML();
<?xml version="1.0" encoding="US-ASCII"?>
<loc>servi&#231;os</loc>
http://www.somesite.com/servi%C3%A7os/redesign