SJIS、EUC-JP、JISなどの日本語をSimpleXMLで利用

XMLと言えばUnicode(UTF-8)な訳だが、
データによってはそうでないものも良くある。
特に、日本語ってやつは面倒くさいことが多い。
日本語の文字コードで代表的なものは、
Shift-JIS, EUC-JP, UTF-8, ISO-2202-JP
一つの言語でこれだけコードがあるのは日本語・中国語・韓国語ぐらいだろう。

simple_xml関数を使用すると、
UTF-8以外の文字コードを使用した場合、
パーサエラーが出ることがある。
結構きまぐれなのか、
環境によって出たりでなかったりしているような印象だ。

マルチバイトと言えばマルチバイト関数mb_convert_encodingが思いつくが、
今回は出番はない。
Do you PHP?
http://www.doyouphp.jp/php5/php5_simplexml.shtml
では、

マルチバイト文字を扱う場合、internal_encodingに変換して出力する

と書いてあるが、
これはデマ。
実際はSimpleXML、もっと言うならlibXMLとmb_convert_encodingはなの横つながりもない。
また、
fladdict.net blog
http://fladdict.net/blog/2006/06/rssutf8.html
で、

PHP5のSimpleXMLが、rss内に不正な文字列があるとパースエラーを起こしてしまうのだけど、つ い に対処法を編み出した。
というか朝思いつきでやったら動いた
$xmlStr = mb_convert_encoding($xmlStr, "SJIS", "UTF-8");	//一度sjisにする
$xmlStr = mb_convert_encoding($xmlStr, "UTF-8", "SJIS");	//またutf8に戻す

とあるが、
これは偶然。
理屈はわからないが偶然動いただけ。

では実際どうなのかというと、
Hawk's W3 Laboratory : XMLパーサ関数で日本語を扱う
http://www.hawk.34sp.com/stdpls/php/xml_parse.html
での記述。

内部エンコーディングはUTF-8
デフォルトでサポートしているエンコーディングは、UTF-8, UTF-16LE/BE, iso-8859-1, ASCII, HTML(エンティティ参照)
iconv が利用可能な環境なら iconvがサポートしているエンコーディングが全て使える

つまり、iconvが影響しているのだ。

XMLのヘッダー部分に

<?xml version="1.0" encode="EUC-JP" ?>

と記述してあるわけだが、
このencode属性を読みとって、
SimpleXMLは変換を行っている。
デフォルトでは

ISO-8859-1
UTF-8 
US-ASCII

の3つにしか対応していないので、
どんなに頑張っても文字化けする。
そこで、別ライブラリiconvを使用すると、
ほぼすべての言語に対応できるというわけ。

日本語を使用するときは、
特別ソースコードを変更することはない。
phpinfoに

iconv

があればよい。
無い場合はのconfigureオプションに

--with-iconv

を追加しておく。


お名前:


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Third Project
証券会社ランキング比較