人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

再びDOM関数について質問させて頂きます。
<?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に出力されず、タグだけが空要素として吐き出されてしまいます。
半角英数で入力されているデータについては、きちんと出力されるのですが・・・。
日本語で入力されているデータもきちんと出力するにはどうすれば良いのでしょうか。

●質問者: pinoco_5018
●カテゴリ:ウェブ制作
✍キーワード:DOM MySQL PHP XML けが
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● bayan
●60ポイント

オンラインマニュアルを見ると次のように書かれています。

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>&#x30EC;&#x30FC;&#x30D9;&#x30EB;</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();
?>
◎質問者からの返答

丁寧なサンプルをありがとうございました!

早速エンコードを設定してみましたところ、うまく出力することができました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ