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

回答の条件
  • 1人3回まで
  • 登録:
  • 終了:2008/01/04 22:55:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:bayan No.1

回答回数100ベストアンサー獲得回数13

ポイント60pt

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

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();
?>
id:pinoco_5018

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

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

2007/12/31 00:55:49

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません