【发布时间】:2019-04-09 21:55:06
【问题描述】:
我正在用 php 中的 DomDocument 生成一个 XML Dom,其中包含一些新闻,包括标题、日期、链接和描述。问题出现在某些新闻的描述上,而在其他新闻上则没有,并且它们都包含重音和变音。
我在 UTF-8 中创建 XML Dom 元素:
$dom = new \DOMDocument("1.0", "UTF-8");
然后,我从 MySQL 数据库中检索我的文本,它以 latin-1 编码,在我使用 mb_detect_encoding 测试编码后,它返回 UTF-8。
我尝试了以下方法:
iconv('UTF-8', 'ISO-8859-1', $descricao);
iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $descricao);
iconv('ISO-8859-1', 'UTF-8', $descricao);
iconv('ISO-8859-1//TRANSLIT', 'UTF-8', $descricao);
mb_convert_encoding($descricao, 'ISO-8859-1', 'UTF-8');
mb_convert_encoding($descricao, 'UTF-8', 'ISO-8859-1');
mb_convert_encoding($descricao, 'UTF-8', 'UTF-8'); //that makes no sense, but who knows
还尝试将数据库编码更改为 UTF-8,并将 XML 编码更改为 ISO-8859-1。
这是生成 XML 的完整方法:
$informativos = Informativo::where('inf_ativo','S')->orderBy('inf_data','DESC')->take(20)->get();
$dom = new \DOMDocument("1.0", "UTF-8");
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$rss = $dom->createElement("rss");
$channel = $dom->createElement("channel");
$title = $dom->createElement("title", "Informativos");
$link = $dom->createElement("link", "http://example.com/informativos");
$channel->appendChild($title);
$channel->appendChild($link);
foreach ($informativos as $informativo) {
$item = $dom->createElement("item");
$itemTitle = $dom->createElement("title", $informativo->inf_titulo);
$itemImage = $dom->createElement("image", "http://example.com/".$informativo->inf_ilustracao);
$itemLink = $dom->createElement("link", "http://example.com/informativo/".$informativo->informativo_id);
$descricao = strip_tags($informativo->inf_descricao);
$descricao = str_replace(" ", " ", $descricao);
$descricao = str_replace(" ", " ", $descricao);
$descricao = substr($descricao, 0, 150).'...';
$itemDesc = $dom->createElement("description", $descricao);
$itemDate = $dom->createElement("pubDate", $informativo->inf_data);
$item->appendChild($itemTitle);
$item->appendChild($itemImage);
$item->appendChild($itemLink);
$item->appendChild($itemDesc);
$item->appendChild($itemDate);
$channel->appendChild($item);
}
$rss->appendChild($channel);
$dom->appendChild($rss);
return $dom->saveXML();
这是一个成功输出的例子:
Segundo a instituição, número de pessoas que vivem na pobreza subiu 7,3 milhões desde 2014, atingindo 21% da população, ou 43,5 milhões de br
还有一个给出编码错误的例子:
procuradores da Lava Jato em Curitiba, que estão sendo investigados por um
suposto acordo fraudulento com a Petrobras e o Departamento de Justi�...
一切都很好,直到上面有问题的描述文本给了我:
“此页面包含以下错误: 第 118 行第 20 列的错误:编码错误 下面是出现第一个错误之前的页面渲染。”
可能
 是这里的问题。由于我无法控制文本是否有这个,我需要正确渲染这些特殊字符。
2019-04-12 更新:在有问题的文本中找出错误并更改示例。
【问题讨论】:
-
也许尝试在输出 XML 之前使用 HTTP 标头设置编码?
header("Content-Type: application/rss+xml; charset=utf-8"); -
在我的响应头中: Content-Type: text/xml;字符集=UTF-8。它已经在 UTF-8 上。尝试了您的建议,结果相同。
-
好的,您可以尝试将其设置为 ISO 8859,并调整您的代码以匹配。我想知道的是网络服务器是否默认为某个与您的数据不匹配的值。
标签: php xml laravel utf-8 domdocument