在php中解析xml和输出编码

时间:2011-10-04 15:31:44

标签: php xml utf-8

我在XML文件中生成Wordpress中的很多帖子。担心:重音字符。

流的标题是:

<? 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 个答案:

答案 0 :(得分:2)

在不同编码之间交换时,您必须掌握很多困难。此外,使用多个字节编码字符的编码(所谓的多字节编码),如WordPress使用的UTF-8,在PHP中值得特别关注。

  • 首先,确保您创建的所有文件都使用与提供的相同的编码进行保存。例如,确保在HTTP Content-Type标题中使用的“另存为...”对话框中设置相同的编码。
  • 其次,您需要验证输入与您要传递的文件具有相同的编码。在您的情况下,输入文件的编码为ISO-8859-15,因此您需要使用iconv()将其转换为UTF-8
  • 第三,您必须知道PHP本身不支持多字节编码,例如UTF-8htmlentities()等函数会产生奇怪的字符。对于其中许多功能,有多字节替代方案,前缀为mb_。如果您的编码为UTF-8,请检查您的文件是否有这些功能,并在必要时替换它们。

有关这些主题的详细信息,请参阅Wikipedia about variable-width encodingspage in the PHP-Manual

答案 1 :(得分:0)

默认情况下,大多数应用程序使用UTF-8数据并输出UTF-8内容。 Wordpress绝对不应该分开,肯定会以UTF-8为基础。

打印时我根本不会转换所有信息,而是将标题更改为UTF-8而不是ISO-8859-15。

答案 2 :(得分:0)

如果您的传入XML数据是ISO-8859-15,请使用iconv()进行转换:

$stream = file_get_contents("stream.xml");
$stream = iconv("iso-8859-15", "utf-8", $stream);

答案 3 :(得分:0)

mb_convert_encoding()拯救了我的生命。

这是我的解决方案:

    $content = preg_replace('/ encoding="ISO-8859-15"/is','',$content);
    $content = mb_convert_encoding($content,"UTF-8");