PHPでXMLパーサすると文字化けする場合の対処法
XMLデータ→XMLパーサ(PHP)→JSONデータ→Ajaxみたいな、出力するまでにえらい長い経由でたどり着く流れを作っております。
一通り出来上がって各種ブラウザで動作確認していたのですが、IE(Internet Explorer)の時だけなぜかJSONデータを読み込めないエラーが!
毎度IEには泣かされます...
トライ&エラーを繰り返しつつ原因を探って行くと、PHPでXMLパーサしてJSON形式に変換した段階で「?????」とか「��(<?>みたいなマーク)」のように一部データに文字化けが発生しているのが原因と突き止めました。
どうやらIEではJSONデータに文字化けがあると読み込めないようです。
過去の経験上、文字化けの発生の原因は文字コードがあってない場合がほとんど。
でも今回はXMLデータからAjaxまで一貫して「UTF-8」で揃ってるハズなのでナゼ問題があるのか皆目見当がつかない...。
困った時にはGoogle先生!というワケでググりまくったらやっぱり原因ありました。
xml_parser_create()で文字エンコーディングを明示する
試行錯誤の段階ではPHPの内部エンコーディングをいじったりしたんですがどうも違ったらしいですwcodeなにがし::PHPのxml_parse()が文字化けする場合の対策そんな指定できるんだ! という事で指定された通りにXMLパーサの生成したら文字化け解消しました♪xml_parse()に渡すデータがちゃんとUTF-8であっても、php.iniでmbstring.internal_encoding = EUC-JPに設定している場合などには、xml_parse()した結果が文字化け(というか単なる?????の羅列で、文字ですら無い状態)することがあります。
この場合、xml_parse()に渡すデータがちゃんとUTF-8であっても、php.iniでmbstring.internal_encoding = EUC-JPに設定している場合などには、xml_parse()した結果が文字化け(というか単なる?????の羅列で、文字ですら無い状態)することがあります。
この場合、
xml_parser_create('UTF-8')のように明示的にエンコーディングを指定してやることで、正しく処理されるようになります(現象を確認したのは Debian Sarge の PHP 4.3 です。未確認ですが、PHP 5 の場合には、そもそも文字化けしないかもしれません)。
PHPのリファレンス本読み返したらxml_parser_create()に文字エンコーディングの指定ありました...。
何も指定しない状態だと「ISO-8859-1」がデフォルトになってるようです。それが原因で文字化けするんですね。
よくあるXMLパーサの解説例なんかでは大概「xml_parser_create()」という風に文字エンコーディングを明示してない場合がほとんどなんで全然気づきませんでした。
やっぱりリファレンスとかちゃんと呼んでおかないとダメですね~
ちなみに他のエンコーディングに「US-ASCII」も指定可能です。
って3種類しか無いのか!