dポイントプレゼントキャンペーン実施中!

index.phpでPC用と携帯用のテンプレートへ振り分けています。(Smarty使用)

携帯でスタイルシートを使う為に、index.phpの先頭で
header("Content-type: application/xhtml+xml");を設定すると
PC側ではXMLパースエラーが生じます。
エラー内容「XML パースエラー: 定義されていない実体が使用されています。」

回避するために色々やってみました。
1、&やなどを使わない
2、PCの時は再度header("Content-type: text/html");を設定
3、DOCTYPEのstrictをTransitionalに変更
この状態だとエラーは出ませんが、1の方法はエンコード処理できなくなりますので無理です。

2、3の方法は問題がないのでしょうか。
できればindex.php一つのファイルでどうにか処理したいのですが、
何かほかにありましたら、ご教授ください。

念のため2の方法でのコードを記述しておきます。
pc.tpl
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dt …
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
<head>
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />
<meta http-equiv="content-style-type" content="text/css" />
<title>{$title}</title>
</head>

index.php
header("Content-type: application/xhtml+xml");
require_once( 'getUserAgent.php' );
require_once( 'Smarty_Common.php' );

// Smartyオブジェクト取得
$smarty =& getMySmarty();
// エージェント取得
$carrier = get_carrier();
if($carrier != 'pc') {
$setXML = '<?xml version="1.0" encoding="Shift-JIS"?>';
$smarty->assign( 'setXML', $setXML );
}else{
header("Content-type: text/html");
}
<省略>

php5 windows

A 回答 (4件)

気づいた事:、


結局出力されるXHTMLはUTF-8なの?Shift_JISなの?
XML宣言でShift_JISって書いているのにmeta要素側ではUTF-8になっている…

あと、
>PC側では
検証したブラウザを全て挙げてくれ。
#普通なら#1の補足では解決しないような内容だと思うので、念のため。

この回答への補足

おっしゃる通りです。混在してしまってますね。
サイトの構築はUTF-8です。
smartyはshift_jisに対応していないので携帯に出力する際mb_convert_encoding($value, "SJIS-WIN", "UTF8");と
エンコードしてます。
XML宣言はUTF-8にすると携帯の方で文字化けするので、
Shift_JISにしてみたところうまくいったのでそのまま・・・。
meta要素がutf-8の場合は、XML宣言もutf-8が妥当なのでしょうか。

自分にはまだ高度だと感じたので、PC用と携帯用を
完全に切り離した方が良いのかなと思い始めています。

検証ブラウザはFirefox、IE、docomoシュミレータ2(xhtml対応)
auシュミレータWAP2.0対応、docomo実機
IEとauはたまに確認する程度です。

何度もすみません。

補足日時:2009/02/14 02:49
    • good
    • 0
この回答へのお礼

何度もお付き合いいただきありがとうございました。
結局、PCと携帯のフォルダを分けて作っていますが、
基本的なことをちゃんと調べるきっかけとなりましたので
感謝致します。

お礼日時:2009/02/18 00:06

IEだと


header("Content-type: application/xhtml+xml");
は対応してませんよ。
と補足。

この回答への補足

メインFirefoxでやっているので気がつきませんでした。

補足日時:2009/02/14 02:48
    • good
    • 0
この回答へのお礼

教えてくださり助かりました。
ありがとうございます。

お礼日時:2009/02/18 00:03

追記:



○ Shift_JIS
× Shift-JIS

http://www.iana.org/assignments/character-sets

#これは直接の原因ではない
    • good
    • 0

大抵の場合出力しているXMLが間違っています。

クライアント側に提供されているソースを目視して確認してみてください。

この手のトラブルは特に


<a href="http://www.google.com/?hl=en&q=hoge">Google英語版でhogeを検索</a>

<a href="http://www.google.com/?hl=en&amp;q=hoge">Google英語版でhogeを検索</a>

のケースで発生するような気がします
HTML 4.01においては
http://www.w3.org/TR/html401/appendix/notes.html

>If it encounters an undeclared entity, the entity should be treated as character data.

と、ミスに対してゆるい対応をするよう求めています。
XHTMLにはおそらくこれはない。XMLとして厳格であることに意味があると思うので。

#Smartyは使ったことがない

この回答への補足

index.phpのheader("Content-type: text/html");を削除して、
PC用テンプレートの
<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" />を
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
にしたところ、PC、携帯の両方でエラーがなくなりました。
これが正解なのかわかりませんので、もう少し調べてみます。

お礼はまた後ほど書かせて頂きます。

補足日時:2009/02/13 01:00
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!