PHP4.4.x スクリプトエンコーディングEUC-JP
の環境でXMLをパースしていました。問題なく動作していました。
PHP5.1.6 スクリプトエンコーディングUTF-8に環境を変えたところ
「Unsupported encoding」のエラーとなります。
予測できる原因をご教授ください。
以下にソースを記載します。(Classの一部)
ちなみに以下で出力されるエラーは
XML error: Unsupported encoding at line 1
となります。
function parseXML($data) {
$xml_parser = xml_parser_create();
xml_parser_set_option($xml_parser,XML_OPTION_CASE_FOLDING,0);
xml_set_element_handler($xml_parser, array(&$this,'startElement'), array(&$this,'endElement'));
if (!xml_parse($xml_parser, $data)) {
die(sprintf("XML error: %s at line %d",xml_error_string(xml_get_error_code($xml_parser)),xml_get_current_line_number($xml_parser)));
}
xml_parser_free($xml_parser);
return $this->xml_datas;
}
function startElement($parser, $name, $attrib) {
reset($attrib);
list($key,$val) = each($attrib);
$this->xml_datas[$key] = $val;
}
function endElement($parser, $name) {
// nothing to do
}
xmlファイルの1行目が
<?xml version="1.0" encoding="UTF-8"?>
になっていないとか、
PHP.iniファイルの設定がEUC-JP用になってるとか。
解析するXMLの文字エンコードタイプと、実体のエンコードに違いがありませんか?
たとえば、XML宣言で
<?xml version="1.0" encoding="EUC-JP" ?>
とあるにもかかわらず、POSTで受け取って parseXML($data) に渡したために、$date の実体が UTF-8 に変換されてしまっているということはないでしょうか。
XMLデータは以下のようになってます。
マルチバイトの文字を含んでないから、PHP側が間違って判断してるってこともありますかね?
<Parent_result>
<result result="1" />
<result redirect="[ここはurlエンコードされたURLです]" />
</Parent_result>
xmlファイルの1行目が
<?xml version="1.0" encoding="UTF-8"?>
になっていないとか、
PHP.iniファイルの設定がEUC-JP用になってるとか。
基本的なことを理解してなかったです。
xml_parser_createなどのマニュアルでSJISサポートって書いてあったんで考えてなかったんですけど、
スクリプトのエンコーディングと合致してないとNGなのですね?
データ側のencoding="x-sjis-cp932"のところをutf-8に変えたら解決しました。
ありがとうございました。
基本的なことを理解してなかったです。
xml_parser_createなどのマニュアルでSJISサポートって書いてあったんで考えてなかったんですけど、
スクリプトのエンコーディングと合致してないとNGなのですね?
データ側のencoding="x-sjis-cp932"のところをutf-8に変えたら解決しました。
ありがとうございました。