Re: 「最近の記事内容」が表示しません。
永らくありがとうございました › フォーラム › インストール › 「最近の記事内容」が表示しません。 › Re: 「最近の記事内容」が表示しません。
2010 年 1 月 15 日 2:16 AM
#3042
キーマスター
送付いただいたxmlファイルをXML_Unserializerに喰わせてみるとPHP5の環境では
Warning
: xml_parse() [function.xml-parse]: input conversion failed due to input error, bytes 0x8F 0xA1 0xC1 0x31 in file xml.php line 106が発生していました。
要するにパース出来ない文字コード(0x8F 0xA1 0xC1 0x31)があるのでやめちゃったよ、みたいな感じですね。orz
文字コード(0x8F 0xA1 0xC1 0x31)については、よくわかりませんが、
問題のxmlファイルをエディタで開きそのまま、上書き保存すると、この現象は発生しませんので、
データ移行の際のRSS読み取り、コード変換のいずれかの時点で紛れ込んだコードかもしれません。
PHP5のXMLは、EUC-JPベースのXMLをXML_Unserializerすると、結果をわざわざUTF-8で返したり、パース出来ない文字コードがあると、処理をやめたり、
どうも喰わせ物みたいです。そんなに、EUC-JPを毛嫌いしないでも・・・ (T_T)
そこで、XMLデータがEUCベースでかつPHP5以上の場合は、
1 XMLデータのXML宣言部分の文字コード宣言をEUC-JPからUTF-8に置換え
2 XMLデータをEUC-JP->UTF-8変換
3 XML_Unserializer処理
4 UnserializeされたデータをUTF-8->EUC-JP変換
の処理を行うことで回避することにしました。
具体的にはinclude/xpress_block_render.phpの22行目あたりからの
<code>function xpress_block_cache_read($mydirname,$block_name)<br /> {<br /> $xml_name = $block_name . '.xml';<br /> $xml_data = xpress_cache_read($mydirname,$xml_name);<br /> <br /> $GLOBALS['DO_LIBXML_PATCH'] = get_xpress_mod_config($mydirname,'libxml_patch');<br /> <br /> $ret = @xpress_XML_unserialize($xml_data);<br /> if (strstr($xml_data, '<?xml version="1.0" encoding="EUC-JP" ?>') !== false){<br /> if (version_compare(PHP_VERSION, '5.0.0', '>')) {<br /> $ans = mb_convert_variables('EUC-JP' , 'UTF-8', &$ret); //xpress_XML_unserialize() Return UTF-8 at PHP5<br /> }<br /> }<br /> return $ret;<br /> }</code>
の部分を
<code>function xpress_block_cache_read($mydirname,$block_name)<br /> {<br /> $xml_name = $block_name . '.xml';<br /> $xml_data = xpress_cache_read($mydirname,$xml_name);<br /> <br /> $GLOBALS['DO_LIBXML_PATCH'] = get_xpress_mod_config($mydirname,'libxml_patch');<br /> <br /> if ( strstr($xml_data, '<?xml version="1.0" encoding="EUC-JP" ?>') !== false<br /> && version_compare(PHP_VERSION, '5.0.0', '>') )<br /> {<br /> $xml_data = str_replace('<?xml version="1.0" encoding="EUC-JP" ?>', '<?xml version="1.0" encoding="UTF-8" ?>', $xml_data);<br /> $ans = mb_convert_variables('UTF-8' , 'EUC-JP', &$xml_data); //EUC-JP to UTF-8<br /> $ret = @xpress_XML_unserialize($xml_data);<br /> $ans = mb_convert_variables('EUC-JP' , 'UTF-8', &$ret); //UTF-8 to EUC-JP<br /> } else {<br /> $ret = xpress_XML_unserialize($xml_data);<br /> }<br /> return $ret;<br /> }</code>
に変更することで、解決されると思います。