<?php
データベース接続(省略します)
###XML作成
$dom = new DomDocument('1.0');
$item = $dom->appendChild(
$dom->createElement('item'));
$title = $item->appendChild(
$dom->createElement('title'));
$title->appendChild(
$dom->createtextNode($com->label));
$auth = $item->appendChild($dom->createElement('author'));
$auth->appendChild(
$dom->createtextNode($author));
$comment = $item->appendChild($dom->createElement('comment'));
$c_auth = $comment->appendChild($dom->createElement('c_author'));
$c_auth->appendChild(
$c_text = $comment->appendChild($dom->createElement('c_message'));
$c_text->appendChild(
$dom->createtextNode($text));
?>
Mysqlに接続し、XMLでデータを出力するプログラムを書いたのですが、
コメントやタイトルが全角文字(日本語)で入力されていた場合、XMLに出力されず、タグだけが空要素として吐き出されてしまいます。
半角英数で入力されているデータについては、きちんと出力されるのですが・・・。
日本語で入力されているデータもきちんと出力するにはどうすれば良いのでしょうか。
オンラインマニュアルを見ると次のように書かれています。
http://www.php.net/manual/ja/ref.dom.php
注意: DOM 拡張モジュールは UTF-8 エンコーディングを使用します。ISO-8859-1 エンコーディングのテキストを扱うには utf8_encode() と utf8_decode() を使用します。またその他のエンコーディングを扱うには Iconv を使用します。
与えるデータの文字コードをUTF-8に変換する必要があるようです。
mbstring マルチバイト文字列関数が有効になっていれば、mb_convert_encoding で UTF-8 に変換してみたらどうでしょうか。
// 例えばデータベースから取得したデータがEUC-JPとして $author = mb_convert_encoding($author,"UTF-8","EUC-JP"); $auth = $item->appendChild($dom->createElement('author')); $auth->appendChild($dom->createtextNode($author));
データベース(読み出し時に変換がかかってないかも注意) をご確認の上やってみてください。
あと DomDocument を new するとき、第二引数でXML文書のエンコーディングを指定しないと、
<title>レーベル</title>
のような文字参照になるので、これが望みで無い場合は指定した方がいいと思います。
次のようなサンプルコードを書いて試してみました。
環境はWindows XP / PHP 5.2.5 です。
(いろいろ試したのでコメントでごちゃごちゃしてますが)
<?php // テストデータの準備 $com = new StdClass; $com->label = mb_convert_encoding("レーベル","UTF-8","SJIS-Win"); $author = mb_convert_encoding("著者","UTF-8","SJIS-Win"); //$text = mb_convert_encoding("テキスト①","UTF-8","SJIS");//①が ? に化ける //$c_author = mb_convert_encoding("テキスト②","UTF-8","SJIS"); $text = mb_convert_encoding("テキスト①","UTF-8","SJIS-Win"); $c_author = mb_convert_encoding("テキスト②","UTF-8","SJIS-Win"); // XMLの作成 //$dom = new DomDocument('1.0'); //$dom = new DomDocument('1.0','Shift_JIS'); //$dom = new DomDocument('1.0','EUC-JP'); //$dom = new DomDocument('1.0','Windows-31J'); // ダメっぽい? $dom = new DomDocument('1.0','UTF-8'); $item = $dom->appendChild($dom->createElement('item')); $title = $item->appendChild($dom->createElement('title')); $title->appendChild($dom->createtextNode($com->label)); $auth = $item->appendChild($dom->createElement('author')); $auth->appendChild($dom->createtextNode($author)); $comment = $item->appendChild($dom->createElement('comment')); $c_auth = $comment->appendChild($dom->createElement('c_author')); $c_auth->appendChild($dom->createtextNode($c_author)); $c_text = $comment->appendChild($dom->createElement('c_message')); $c_text->appendChild($dom->createtextNode($text)); // 出力 echo $dom->saveXML(); ?>
丁寧なサンプルをありがとうございました!
早速エンコードを設定してみましたところ、うまく出力することができました。