Json到希腊字符的xml

时间:2011-08-11 13:52:30

标签: php json unicode utf-8 simplexml

我正在使用curl来获取一个可以放在这里的json文件:(复制粘贴的时间太长了):http://www.opap.gr/web/services/rs/betting/availableBetGames/sport/program/4100/0/sport-1.json?localeId=el_GR

之后我使用json_decode来获取assosiative数组。到这里一切似乎都没问题。当我使用var_dump时,数组中的字符是希腊语。之后我使用下面的代码:

    $JsonClass = new ArrayToXML();
    $mydata=$JsonClass->toXml($json);

class ArrayToXML {

public static function toXML( $data, $rootNodeName = 'ResultSet', &$xml=null ) {

    // turn off compatibility mode as simple xml throws a wobbly if you don't.
   // if ( ini_get('zend.ze1_compatibility_mode') == 1 ) ini_set ( 'zend.ze1_compatibility_mode', 0 );
    if ( is_null( $xml ) ) //$xml = simplexml_load_string( "" );
        $xml = simplexml_load_string("<?xml version='1.0' encoding='UTF-8'?><$rootNodeName />");

    // loop through the data passed in.
    foreach( $data as $key => $value ) {

        $numeric = false;

        // no numeric keys in our xml please!
        if ( is_numeric( $key ) ) {
            $numeric = 1;
            $key = $rootNodeName;
        }

        // delete any char not allowed in XML element names
        `enter code here`$key = preg_replace('/[^a-z0-9\-\_\.\:]/i', '', $key);

        // if there is another array found recrusively call this function
        if ( is_array( $value ) ) {
            $node = ArrayToXML::isAssoc( $value ) || $numeric ? $xml->addChild( $key ) : $xml;

            // recrusive call.
            if ( $numeric ) $key = 'anon';
            ArrayToXML::toXml( $value, $key, $node );
        } else {

            // add single node.
            $value = htmlentities( $value );
            $xml->addChild( $key, $value );
        }
    }

    // pass back as XML
    return $xml->asXML();


}
public static function isAssoc( $array ) {
    return (is_array($array) && 0 !== count(array_diff_key($array, array_keys(array_keys($array)))));
}

}

问题就出现了。结果中的所有希腊字符都是一些奇怪的字符&Icirc;?&Icirc;?&Icirc;&yen;&Icirc;?&Icirc;?&Icirc;&iexcl;&Icirc;&copy;&Icirc;&pound;&Icirc;?&Icirc;?例如。我真的不知道我做错了什么。我对编码/解码事情非常不好:(

为了使这一点更清楚:

以下是assosiative数组(我遇到问题的部分)的样子:

{ ["resources"]=> array(4) { ["team-4833"]=> string(24) "ΛΕΥΚΟΡΩΣΙΑ U21" ["t-429"]=> string(72) "ΠΡΟΚΡΙΜΑΤΙΚΑ ΕΥΡΩΠΑΪΚΟΥ ΠΡΩΤΑΘΛΗΜΑΤΟΣ" ["t-429-short"]=> string(6) "ΠΕΠ" ["team-15387"]=> string(16) "ΕΛΛΑΔΑ U21" } ["locale"]=> string(5) "el_GR" } ["relatedNum"]=> NULL }

以下是使用simplexml后得到的内容

<resources><team-4833>&Icirc;?&Icirc;?&Icirc;&yen;&Icirc;?&Icirc;?&Icirc;&iexcl;&Icirc;&copy;&Icirc;&pound;&Icirc;?&Icirc;? U21</team-4833><t-429>&Icirc;&nbsp;&Icirc;&iexcl;&Icirc;?&Icirc;?&Icirc;&iexcl;&Icirc;?&Icirc;?&Icirc;?&Icirc;&curren;&Icirc;?&Icirc;?&Icirc;? &Icirc;?&Icirc;&yen;&Icirc;&iexcl;&Icirc;&copy;&Icirc;&nbsp;&Icirc;?&Icirc;&ordf;&Icirc;?&Icirc;?&Icirc;&yen; &Icirc;&nbsp;&Icirc;&iexcl;&Icirc;&copy;&Icirc;&curren;&Icirc;?&Icirc;?&Icirc;?&Icirc;?&Icirc;?&Icirc;?&Icirc;&curren;&Icirc;?&Icirc;&pound;</t-429><t-429-short>&Icirc;&nbsp;&Icirc;?&Icirc;&nbsp;</t-429-short><team-15387>&Icirc;?&Icirc;?&Icirc;?&Icirc;?&Icirc;?&Icirc;? U21</team-15387></resources><locale>el_GR</locale></lexicon><relatedNum></relatedNum></betGames>

提前感谢您的回复。

PS:我在页面中还有<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我显示了结果,但它没有帮助。


我仍然没有找到解决方案,所以我使用了一种类似Yannis建议的不同方法。我使用我在http://www.phpclasses.org/package/1826-PHP-Store-associative-array-data-on-file-in-XML.html找到的类将XML保存在一个文件中。

之后我用simplexml_load_file加载xml并使用xslt访问所有节点中的数据并将其存储在我的数据库中。这样工作正常。如果有人仍想尝试解释我为什么它不起作用我一开始就尝试这样做的方式感觉自由(仅用于学习目的:p)感谢您的回复:)。

4 个答案:

答案 0 :(得分:1)

没有必要 - 当前的json也以xml格式提供,显然:

http://www.opap.gr/web/services/rs/betting/availableBetGames/sport/program/4100/0/sport-1.xml?localeId=el_GR

只需要稍微使用url参数:)

答案 1 :(得分:0)

这对我使用php版本5.3.6的Chrome:

    $json = file_get_contents('http://www.opap.gr/web/services/rs/betting/availableBetGames/sport/program/4100/0/sport-1.json?localeId=el_GR');
    $json = json_decode($json, true);
    $xml = new SimpleXMLElement('<ResultSet/>');
    array_walk_recursive($json, array ($xml, 'addChild'));
    print $xml->asXML();
    exit();

答案 2 :(得分:0)

显然,您的错误是您正在操作UTF-8编码的Unicode,就好像这些字节是ISO-8859-1一样。

我看不出这发生在哪里;可能在你htmlentities的电话中,无论是什么。

它可能需要使用某种“多字节”黑客,可能包括这种模式之类的东西:

/([^\x00-\x7F])/u

具有明确的/u,因此它适用于逻辑代码点而不是8位代码单元(读取:字节)。它可以这样做来获取一个非ASCII代码点,以便它可以用数字实体替换它。没有容易被遗忘的/u,它将在字节而不是代码点上工作,这与您的描述显示的内容相匹配。

可能是这种情况,或者可能是你必须交换到某些mb_*()函数而不是普通函数。这是为了解决基本的底层PHP错误,它在语言中没有真正的Unicode支持,只是一些乐队助手在这里和那里看起来似乎不时无缘无故地脱落。

如果你可以使用一种干净的语言,不仅有正确的Unicode支持,而且物理字节和抽象字符之间也有清晰的分离,那么这种事情就不会发生。但我敢打赌,这是其他人必须拥有的常见问题,所以如果它是一个库错误而不是代码中某处(完全可以理解!)的疏忽,我会感到非常惊讶。

答案 3 :(得分:0)

  

在希腊的问题中回答---------   单词“?[ΛΕΥΚΟ]”?它有ASC(他的代码字符)203-197-213-202-207()----------   然而,当你读到他[prostithete] 206并将字母加倍时----------   但也改变代码如下206-(203-48 = 155)-206-(197-48 = 149)-206-(213-48 = 165) -   -206-(213-48 = 165)-206-(202-48 = 154)-206-(207-48 = 159)-------------   因此,如果你发现206要忽略---------他们正在检查一个角色的解决方案   他和下一个角色的ASC添加数字48并找到新角色。 &GT; ------------   因为我也用[ΠΠΠ]的[ΑΠΟΚΟΔΙΚΟΠΟΙΗΣΗ]处理他们所知的每一个新知识[ΕΥΠΡΟΣΔΕΚΤΟ] ------   在邮件中 - &gt;? bluegt03@in.gr