#setlinebreak(on)
 * SJIS、EUC-JP、JISなどの日本語をSimpleXMLで利用 [#i74ad925]
 #htmlinsert(googleAdsense.html)
 
 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
 を追加しておく。
 
 
 
 
 
 #comment
 


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