Я создаю XML Dom с DomDocument на php, содержащий некоторые новости, с заголовком, датой, ссылками и описанием.Проблема возникает при описании некоторых новостей, но не в других, и оба они содержат акценты и cedilla.
Я создаю элемент XML Dom в UTF-8:
$dom = new \DOMDocument("1.0", "UTF-8");
Затем я извлекаю свой текст из базы данных MySQL, которая закодирована в латинице-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: Обнаружена ошибка в проблемном текстеи изменил пример.