XPressME Integration Kit

フォーラム

Re: 「最近の記事内容」が表示しません。

#3042
toemon
キーマスター

送付いただいた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>

に変更することで、解決されると思います。