Php Json到带有希腊字符的xml

Php Json到带有希腊字符的xml,php,json,unicode,utf-8,simplexml,Php,Json,Unicode,Utf 8,Simplexml,我正在使用curl获取一个json文件,可以在这里找到:(复制粘贴太长了): 在此之后,我使用json_decode获得Associative数组。在这里,一切似乎都正常。当我使用var_dump时,数组中的字符是希腊语。之后,我使用以下代码: $JsonClass = new ArrayToXML(); $mydata=$JsonClass->toXml($json); 类ArrayToXML { 下面是使用simplexml后得到的结果 <resources&g

我正在使用curl获取一个json文件,可以在这里找到:(复制粘贴太长了):

在此之后,我使用json_decode获得Associative数组。在这里,一切似乎都正常。当我使用var_dump时,数组中的字符是希腊语。之后,我使用以下代码:

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

下面是使用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>
Icirc;?Î;?Î;¥;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;&ICIR不包括:Icirc;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;Î;&U21el
提前感谢您的回复

注:我在页面中也显示了结果,但没有帮助


我仍然没有找到解决方案,所以我使用了Yannis建议的不同方法


之后,我用simplexml_load_文件加载xml,并使用xslt访问所有节点中的数据并将其存储在我的数据库中。这样做效果很好。如果有人还想尝试解释为什么它不能以我一开始尝试的方式工作,请放心(仅用于学习目的:p)感谢您的回复:)。

这对我使用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();
$json=file\u get\u 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=新的SimpleXMLElement(“”);
array_walk_recursive($json,array($xml,'addChild'));
打印$xml->asXML();
退出();

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


只需稍微处理一下url参数:)

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

我看不出这是在哪里发生的;可能是在您对
htmlentities
的调用中,不管是什么

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

/([^\x00-\x7F])/u
使用显式的
/u
使其在逻辑代码点而不是8位代码单元(读取:字节)上工作。它可能会抓取一个非ASCII代码点,以便用数字实体替换它。如果没有容易忘记的
/u
,它将在字节而不是代码点上工作,这与您的描述所显示的情况相符

可能是这种情况,也可能是您必须切换到一些
mb_*()
函数,而不是普通函数。这是为了解决基本的PHP错误,即该语言中没有真正的Unicode支持,只是偶尔出现一些乐队助手,似乎没有什么好的理由会不时脱落

如果你能使用一种干净的语言,它不仅支持正确的Unicode,而且在物理字节和抽象字符之间有一个清晰的分隔,这种事情就不会发生。但我敢打赌这是其他人一定也有的一个常见问题,所以如果它是一个库错误而不是一个(完全可以理解!)代码中的某些地方存在疏忽

从希腊回答你的问题--------- 单词“∧ΕΥΚС”?它有ASC(他的代码字符)203-197-213-202-207()---------- 然而,当你读到他[普罗斯特特]的时候,206和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并查找新角色。>------------ 因为我也处理每一个新知识的[Α∏∏∏Κ∏Κ∏Κ∏Κ∑∑Η------ 邮寄-->?bluegt03@in.gr


这只在数组没有数字元素的情况下才有效。json的方式是,它在ASOSiactive数组中始终有数字元素。因此xml将有数字元素。
    $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();
/([^\x00-\x7F])/u