今だけ人気マンガ100円レンタル特集♪

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

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q急にXMLパースエラーが表示されるようになりました

現在運営しているサイトでRSSを配信しています。

特にどこかをいじった覚えはないのですが
先月末ごろから急に以下のようなエラーがでるようになりました。
※ブラウザはFirefoxを使っています。

XML パースエラー: 要素が見つかりません。
URL: http://www.○○○.com/index.rdf
行番号: 1, 列番号: 1:

メールソフトでも受信しようとすると「有効なRSSファイルではありません」と表示されるようになりました。

文字コードの設定も確認したのですが原因がわかりません。

配信しているrdfファイルは以下のようになっております。
<?php
$uri = "http://feeds.feedburner.jp/○○○";
$reqq = file_get_contents( $uri );
header("Content-type: application/xml");
print $reqq;
?>

しくみはよくわかってないのですが
本体部分は別のファイルから読み込んでいます。
また、不思議なのは上記のhttp://feeds.feedburner.jp/○○○
部分のURLにアクセスすると正常にRSS情報が表示されます。


本体ファイル
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
xmlns="http://purl.org/rss/1.0/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xml:lang="ja">
...以下続く


原因がまったく特定できず困っております。
宜しくお願いいたします。

現在運営しているサイトでRSSを配信しています。

特にどこかをいじった覚えはないのですが
先月末ごろから急に以下のようなエラーがでるようになりました。
※ブラウザはFirefoxを使っています。

XML パースエラー: 要素が見つかりません。
URL: http://www.○○○.com/index.rdf
行番号: 1, 列番号: 1:

メールソフトでも受信しようとすると「有効なRSSファイルではありません」と表示されるようになりました。

文字コードの設定も確認したのですが原因がわかりません。

配信しているrdfファイルは...続きを読む

Aベストアンサー

PHP経験なし。

>※ブラウザはFirefoxを使っています。

>また、不思議なのは上記のhttp://feeds.feedburner.jp/○○○
部分のURLにアクセスすると正常にRSS情報が表示されます。

であることから
http://feeds.feedburner.jp/○○○に誤りはまずない。なので
原因はPHP側。file_get_contentsかprintか知らないが。

俺としてはこれに似たケースに思えるが,先ほども言ったとおり未経験なので自信なし。
http://oshiete1.goo.ne.jp/qa2757771.html

>PHPを確認するまえにまず出力されたXMLを検証する所
さらに言うと,俺なら
W3C Markup Validatorをかけるんじゃなくて
application/xmlをtext/plainにしてどうなっているか見てみると思う。

>In addition,
>"application/xml" media type is not specific enough
なのでヘッダで文字コード指定しなきゃいけないということはないと思おう。

PHP経験なし。

>※ブラウザはFirefoxを使っています。

>また、不思議なのは上記のhttp://feeds.feedburner.jp/○○○
部分のURLにアクセスすると正常にRSS情報が表示されます。

であることから
http://feeds.feedburner.jp/○○○に誤りはまずない。なので
原因はPHP側。file_get_contentsかprintか知らないが。

俺としてはこれに似たケースに思えるが,先ほども言ったとおり未経験なので自信なし。
http://oshiete1.goo.ne.jp/qa2757771.html

>PHPを確認するまえにまず出力されたXMLを検証する所
さ...続きを読む

Qパースエラーとは?

PHPやMySQLを勉強して半年ほどになり、本を見ながらですが、ソースをだいたいわかるようになったのですが、いまだ、パースエラーとは何なのかよくわかりません。誰かわかる方いらっしゃいますか。それと、プログラムの中にパースエラーがわかるまでに要した時間を表示するかどうかあるのですが、表示する意味があるのかも教えてください。よろしくお願いします

Aベストアンサー

おはようございます。

parse errorとは、構文のエラーです。
例えば、「;(セミコロン)」が抜けていたり、
「{(カッコ)」が閉じられていなかったりとかです。
表示しなかった場合、エラー時に、画面全体が真っ白で
ロード中なのか、エラーなのかの判別が難しくなります。
(実際は、そこまで難しくはないのですが・・・。)
表示していれば、一目瞭然です。

回答がはずしていたら、ごめんなさい。

QHTMLフォームのSELECTの幅を一定にするためには?

HTMLフォームのSELECTの幅を一定にするためにはどのようにすれば
いいのでしょうか?

CSS等で設定できるとありがたいのですが、やり方がわかりません。

Aベストアンサー

<select style="width: 200px">

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む


人気Q&Aランキング