парсинг xml и выходной кодировки в php - PullRequest
1 голос
/ 04 октября 2011

Я генерирую много постов в Wordpress из файла XML.Беспокойство: акцентированные символы.

Заголовок потока:

<? Xml version = "1.0" encoding = "ISO-8859-15"?>

Вот полный поток: http://flux.netaffiliation.com/rsscp.php?maff=177053821BA2E13E910D54

Мой сайт находится в utf8.

Поэтому я использую функцию utf8_encode ... но это не решает проблему, акценты всегда неправильно понимаются.

У кого-нибудь есть идея?

РЕДАКТИРОВАТЬ04-10-2011 18:02 (французский час):

Вот полный поток: http://flux.netaffiliation.com/rsscp.php?maff=177053821BA2E13E910D54

Вот мой код:

/**
 * parse an rss flux from netaffiliation and convert each item to posts
 * @var $flux = external link
 * @return bool
 */
private function parseFluxNetAffiliation($flux)
{
    $content = file_get_contents($flux);
    $content = iconv("iso-8859-15", "utf-8", $content);

    $xml = new DOMDocument;
    $xml->loadXML($content);

    //get the first link : http://www.netaffiliation.com
    $link = $xml->getElementsByTagName('link')->item(0);
    //echo $link->textContent;

    //we get all items and create a multidimentionnal array
    $items = $xml->getElementsByTagName('item');

    $offers = array();
    //we walk items
    foreach($items as $item)
    {
        $childs = $item->childNodes;

        //we walk childs
        foreach($childs as $child)
        {
            $offers[$child->nodeName][] = $child->nodeValue;
        }

    }
    unset($offers['#text']);

    //we create one article foreach offer
    $nbrPosts = count($offers['title']);

    if($nbrPosts <= 0) 
    {
        echo self::getFeedback("Le flux ne continent aucune offre",'error');
        return false;
    }

    $i = 0;
    while($i < $nbrPosts)
    {
        // Create post object
        $description = '<p>'.$offers['description'][$i].'</p><p><a href="'.$offers['link'][$i].'" target="_blank">'.$offers['link'][$i].'</a></p>';

        $my_post = array(
            'post_title' => $offers['title'][$i],
            'post_content' => $description,
            'post_status' => 'publish',
            'post_author' => 1,
            'post_category' => array(self::getCatAffiliation())
        );

        // Insert the post into the database
        if(!wp_insert_post($my_post));;

        $i++;
    }

    echo self::getFeedback("Le flux a généré {$nbrPosts} article(s) depuis le flux NetAffiliation dans la catégorie affiliation",'updated');
    return false;

}

Все сообщения созданы, но ... акцентированные символы уродливы.Вы можете увидеть результат здесь: http://monsieur -mode.com / test /

Ответы [ 4 ]

2 голосов
/ 04 октября 2011

Есть много трудностей, которые вы должны преодолеть при переключении между различными кодировками. Кроме того, кодировки, использующие более одного байта для кодирования символов (так называемые многобайтовые кодировки), такие как UTF-8, который используется в WordPress, заслуживают особого внимания в PHP.

  • Во-первых, убедитесь, что все создаваемые вами файлы сохранены в той же кодировке, в которой они будут обслуживаться. Например, убедитесь, что вы установили ту же кодировку, что и в диалоговом окне «Сохранить как ...», как вы используете в заголовке HTTP Content-Type.
  • Во-вторых, вам нужно убедиться, что вход имеет ту же кодировку, что и файл, который вы хотите доставить. В вашем случае входной файл имеет кодировку ISO-8859-15, поэтому вам необходимо преобразовать его в UTF-8, используя iconv().
  • В-третьих, вы должны знать, что PHP изначально не поддерживает многобайтовые кодировки, такие как UTF-8. Такие функции, как htmlentities() будут производить странные символы. Для многих из этих функций существуют альтернативы с многобайтовыми кодами, в которых префикс mb_. Если ваша кодировка UTF-8, проверьте ваши файлы на наличие таких функций и замените их при необходимости.

Подробнее об этих темах см. В Википедии о кодировках переменной ширины и странице в руководстве по PHP .

0 голосов
/ 05 октября 2011

mb_convert_encoding() спасает мою жизнь.

Вот мое решение:

    $content = preg_replace('/ encoding="ISO-8859-15"/is','',$content);
    $content = mb_convert_encoding($content,"UTF-8");
0 голосов
/ 04 октября 2011

Если ваши входящие XML-данные ISO-8859-15, используйте iconv() для их преобразования:

$stream = file_get_contents("stream.xml");
$stream = iconv("iso-8859-15", "utf-8", $stream);
0 голосов
/ 04 октября 2011

По умолчанию большинство приложений работают с данными UTF-8 и выводят содержимое UTF-8. Wordpress определенно не должен быть обособленным и, безусловно, работает на основе UTF-8.

Я бы просто не конвертировал какую-либо информацию при печати, вместо этого изменил бы заголовок на UTF-8 вместо ISO-8859-15.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...