携帯サイト制作でのXHTML+Shift_JISの問題について

このQ&Aのポイント
  • 携帯サイト制作でのXHTML+Shift_JISでの出力がうまくいかず、文字化けや表示の問題に悩まされています。
  • 具体的な現象として、DoCoMoとFirefoxで文字化けが起きる問題、DoCoMoでXHTMLではなくHTMLと解釈されてしまう問題、そして何も出力されなくなる問題があります。
  • PHPの設定やXHTMLの記述に関連しているのかもしれませんが、詳細な原因や解決策はわかりません。ヒントやアドバイスをいただけると助かります。
回答を見る
  • ベストアンサー

携帯サイト制作をしておりまして、XHTML+Shift_JISで出力で

携帯サイト制作をしておりまして、XHTML+Shift_JISで出力できずかなり悩まされています。なんでも結構ですのでヒントをいただけましたら幸いです。。 【現象1】 文字化けする。DoCoMoとFireFoxでいずれもUTF-8のコードをShift_JISとして表示しようとしている。 (PHPの記述) header("Content-Type: application/xhtml+xml; charset=Shift_JIS"); mb_internal_encoding('UTF-8'); mb_http_output('Shift_JIS') ob_start('mb_output_handler'); (XHTMLの記述) <!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.1) 1.0//EN" "i-xhtml_4ja_10.dtd"> <html xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=shift_jis" /> 【現象2】 PHPでShift_JISで出力できているが、DoCoMoで見るとXHTMLではなくHTMLと解釈されてしまっている。なので<div style="background-color..といったものが無効になっている。 (PHPの記述) mb_internal_encoding('UTF-8'); mb_http_output('Shift_JIS') ob_start('mb_output_handler'); (XHTMLの記述) 現象1と同じ。 【現象3】 DoCoMoとFirefoxいずれも何も出力されなくなる。ソースも表示できない。 (PHPの記述) 現象2と同じ。 (XHTMLの記述) <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.1) 1.0//EN" "i-xhtml_4ja_10.dtd"> <html xml:lang="ja"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=shift_jis" /> 【開発条件】 PHP=PHP Version 5.1.6 言語=XHTML サーバー=XSERVER 確認キャリア=DoCoMo N904i phpinfoの内容 output_buffering no value no value output_handler no value no value default_charset no value no value mbstring.detect_order auto auto mbstring.encoding_translation Off Off mbstring.func_overload 0 0 mbstring.http_input auto auto mbstring.http_output SJIS SJIS mbstring.internal_encoding EUC-JP EUC-JP mbstring.language Japanese Japanese mbstring.strict_detection Off Off mbstring.substitute_character no value no value ●謎1 header("Content-Type: application/xhtml+xml; charset=Shift_JIS");をつけると なぜShift_JISに変換してくれなくなるのでしょう? ●謎2 <?xml version="1.0" encoding="Shift_JIS"?> をつけると何も出力されなくなるのはなぜでしょう?

  • PHP
  • 回答数1
  • ありがとう数12

質問者が選んだベストアンサー

  • ベストアンサー
  • cobe
  • ベストアンサー率23% (54/227)
回答No.1

mb_output_handler をつかったエンコーディングの自動変換は、content-typeがtext/htmlの時に動くという成約があった記憶があります(そうしないとバイナリまで変換しちゃうから)。 これが謎1の答えで、エンコーディングに食い違いがあるので謎2も釣られてダメになるではないかと。

gogoyamada
質問者

お礼

ご回答いただきましてありがとうございます! 再度PHPマニュアルを見返してみましたところ以下のような記述がありました。 --------------- 注意: PHP 4.3.0 以降において、 イメージのようなバイナリデータを PHP スクリプトから出力したい場合、 バイナリデータを送信する前に header() により Content-Type: ヘッダ(例:header("Content-Type: image/png"))を 送信する必要があります。Content-Type: ヘッダが送信されると出力文字 コード変換は無効となります。 ただし、header() により"Content-Type: text/*" を送信した場合には、テキストが送信されるとみなし、文字コード設定に 基づいて出力文字コード変換を行います。 --------------- おっしゃる通りでした。 早速試してみたいと思います。ありがとうございます!

関連するQ&A

  • phpでCSS対応させ文字コードを変更する方法

    phpで、i-mode対応CSSを使用し、EUCのMySQLのデータをShift-JISで表示させたい、というものです。 .htaccess 内で、 php_flag output_buffering On php_value output_handler mb_output_handler php_value default_charset Shift_JIS php_value mbstring.language Japanese php_flag mbstring.encoding_translation On php_value mbstring.http_input auto php_value mbstring.http_output SJIS php_value mbstring.internal_encoding EUC-JP php_value mbstring.substitute_character none php_value mbstring.script_encoding auto という記述を入れています。 Shift-JISの***.phpで、DBの内容を正しく表示することができています。 CSSに対応させるために、phpファイル内で、 HTTP_USER_AGENT が docomoの場合のみ header("Content-Type:application/xhtml+xml"); ... <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.0) 1.0//EN" "i-xhtml_4ja_10.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">..... という記述をして、CSSを使用したいのですが 上記の.htaccess を入れると、CSSは使用できても、文字化けしてしまいます。 .htaccess での文字コードの変換と header("Content-Type:application/xhtml+xml"); を同時に使っているのが原因かと思うのですが、解決方法がわかりません。 テンプレートや関数で変換する方法しかないでしょうか。 解決方法をご存知でしたらお教えください。よろしくお願いします。

    • ベストアンサー
    • PHP
  • syntax error, unexpected T_STRING

    携帯の端末別にXHTMLを表示する書籍のサンプルコードを記載しましたが以下のようなエラーが発生しました。 Parse error: syntax error, unexpected T_STRING in /home/oeppu/public_html/xhtml.php on line 14 14行目は以下の部分です。 <?xml version="1.0" encoding="Shift_JIS"?> ソースコードはShift-JISとEUCでそれぞれ試して見ましたが同じ結果でした。 初心者ですので根本的な部分が間違っているのかもしれません。ご指摘宜しくお願い致します。 /* xhtml_test.php */ <?php // 内部文字コードを出力文字コードに変換するライブラリー require_once 'output_encode.php'; // アクセス端末に対応したXHTMLのDOCTYPEを取得するライブラリー require_once 'mobile_xhtml_doctype.php'; // 出力のバッファリングを有効にする ob_start(); ?> <?xml version="1.0" encoding="Shift_JIS"?> <?php echo mobile_xhtml_doctype(); ?> <html> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=Shift_JIS" /> <meta http-equiv="pragma" content="no-cache" /> <meta http-equiv="cache-control" content="no-cache" /> <meta http-equiv="expires" content="-1" /> <titel>XHTML TEST</titel> <body> XHTML TEST </body> </html> <?php output_encode(); ?> /* output_encode.php */ <?php function output_encode() { $str = ob_get_contents(); $output = mb_convert_encoding($str, 'SJIS-win', mb_internal_encoding()); ob_end_clean(); header('Content-Type: application/xhtml+xml;'); echo $output; } ?> /* .htaccess */ php_value mbstring.language Japanese php_flag mbstring.encoding_translation On php_value mbstring.script_encoding SJIS php_value mbstring.internal_encoding SJIS

    • ベストアンサー
    • PHP
  • 携帯サイト用 XHTML doctype宣言

    今、携帯サイトでXHTMLを使用したサイトを作成すること考えています。 3つのキャリアを別々に作るのは趣味範囲では難しいため、3つのキャリアに対応しているサイトの作成を考えています。 そこでdoctype宣言についてご質問なのですが、3つのキャリアは別々の宣言があり、 Docomoなら <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/*.*) 1.0//EN" "i-xhtml_4ja_10.dtd"> SoftBankなら <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//J-PHONE//DTD XHTML Basic 1.0 Plus//EN" "xhtml-basic10-plus.dtd"> auなら <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//OPENWAVE//DTD XHTML 1.0//EN" "http://www.openwave.com/DTD/xhtml-basic.dtd"> とあります。 これらの宣言を記述するとキャリアごとにサイトを作成しないといけないため、3キャリア共通の宣言をご教授いただけないでしょうか? また、ないのであればこれらをXMLファイルに書き込みhtmlファイル内の記述でXMLファイルを読み込むことは可能でしょうか? 可能なのであればその際の記述方法をご教授いただけないでしょうか? 宜しくお願い致します。

  • 携帯サイトでphpを使いdocomo宣言をすると、PCで上手く表示されない

    現在、携帯サイトを作っているのですが、下記のような書き方だとdocomoではCSSもきいて上手く表示されるのですが、I Eで表示させようとするとダウンロード画面が出てきます。 PC、携帯、共に同じ表示にさせたいのですが、どうすればいいでしょうか。 ご教授お願いします。 <?php header("Content-type: application/xhtml+xml;charset=Shift_JIS"); ?> <!DOCTYPE html PUBLIC "-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/1.1) 1.0//EN" "i-xhtml_4ja_10.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=shift_JIS" />

    • ベストアンサー
    • PHP
  • こんにちは。ドコモ端末のスタイルについて質問です

    ドコモ端末用のウェブページをPHPで作成中です。 CSSについて悩んでいます。 ソース(ファイルの文字コードはutf-8) ※絵文字出力にmobileClassというライブラリを使っています。 ---------------------------------------------- //絵文字ライブラリ require_once "./lib/MobileClass.php"; $mobileClass = new MobileClass('http://' . $_SERVER['HTTP_HOST'] . '/img/emoji/'); ini_set("default_charset", "Shift_JIS"); ini_set('mbstring.http_output', "Shift_JIS") header('Content-Type: application/xhtml+xml; charset=Shift_JIS'); print "<?xml version='1.0' encoding='Shift_JIS'?>"; print "<!DOCTYPE html PUBLIC '-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/2.0) 1.0//EN' 'i-xhtml_4ja_10.dtd'>"; print "<html><head>"; print "<meta http-equiv='Content-Type' content='xhtml+xml; charset=Shift_JIS'>"; print "</head><body>"; print "テストページ"; print "絵文字:".$mobileClass->Convert('F988')." "; print "</body>"; ---------------------------------------------- このソースだと文字化けしてしまいます。 ob_start()を使用して、 mb_convert_encodingでShift_JISに一括変換して出力すると文字化けはしませんが、絵文字が表示されなくなります。文字化けせずに絵文字も表示させたいのですがどうしたら良いでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • i-modeでxhtmlをみるには、、

    Perlからxhtmlをはきだして、i-modeで見れるようにしたいのですが、 表示がうまくいきません。 ヘッダーは Content-type: text/html; charset=Shift_JIS <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-Transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> こんな感じです。 「Content-type: text/html; charset=Shift_JIS」の部分を 「Content-Type: application/xhtml+xml」や 「Content-Type: application/xhtml」等でやっても表示されませんでした。 もし分かる方がいましたら教えてください。 宜しくお願いします。

    • 締切済み
    • XML
  • 携帯サイトの作り方 XHTMLについて教えてください。

    3キャリア共通の携帯サイトを作成したいと思っています。 見よう見まねで、XHTMLのサイトを作成しましたが、 ドコモから配布されているシュミレーターでは、 問題なく表示されているのですが、実機で試すと うまく表示されません。 auの端末は、問題なく表示されます。 PC上でも、問題なく表示されます。 SBは端末がないので、まだ未確認なのですが。。。 共通では、表示が不可能なのでしょうか? 全キャリア共通で表示する方法を、 タグで教えて頂けると助かります! ちなみに、下記が、現在使用しているものですが、 これが間違っているものなのか、ご存じの方がいれば 何卒、ご教授願います。 <?xml version="1.0" encoding="Shift_JIS"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=Shift_JIS" /> <meta http-equiv="Content-Style-Type" content="text/css" /> <meta http-equiv="Cache-Control" content="no-cache" /> <!--<meta name="vnd.up.markable" wml:forua="true" content="false" />-->

  • 携帯サイト

    携帯サイトとPCサイトを作成したのですが、PCのポータルサイト(yahoo,google,msn)にてあるキーワードで検索すると一番上にPCサイトが表示されるのですが、二番目に携帯サイトが表示されます。 携帯サイトではXHTMLにて記述しております。 PCではなく携帯のポータルサイトのみに表示されるには自動振り分けなどをしたほうがよろしいのでしょうか? 記述は下記のようにしております。 <?xml version="1.0" encoding="shift_jis"?> <html xmlns="​http://www.w3.org/1999/xhtml"​ xml:lang="ja"> <head> <title>********</title> <meta http-equiv="cache-control" content="no-cache"/> <meta name="keywords" content="************"/> <meta name="description" content="**********"/> <meta http-equiv="content-type" content="text/html; charset=shift_jis" /> <base href="​http://www.******/mobile/">​ </head> ご教授お願いします。

    • ベストアンサー
    • HTML
  • 携帯サイトを作成しているのですが、DOCTYPE宣言で

    携帯サイトを作成しているのですが、DOCTYPE宣言で <!DOCTYPE HTML PUBLIC \"-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/2.3) 1.0//EN\" \"i-xhtml_4ja_10.dtd\"> (ドコモ使用時) だけがページに表示されてしまいます。書き方に間違いがあるのでしょうか? 又、これは受け入れられてないのでしょうか? どなたかわかる方アドバイスよろしくおねがいします。 ↓プログラム添付 <?php $agent=$_SERVER['HTTP_USER_AGENT']; if(preg_match("/DoCoMo/", $agent)) { print("<?xml version=\"1.0\" encoding=\"Shift_JIS\"?>\n"); print ("<!DOCTYPE HTML PUBLIC \"-//i-mode group (ja)//DTD XHTML i-XHTML(Locale/Ver.=ja/2.3) 1.0//EN\" \"i-xhtml_4ja_10.dtd\">\n"); print ("<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"ja\" xml:lang=\"ja\">\n"); print ("<head>\n"); print ("<meta http-equiv=\"Content-Type\" content=\"application/xhtml+xml; charset=Shift_JIS\" />"); } elseif・・・・

    • ベストアンサー
    • PHP
  • 携帯サイト

    携帯サイトとPCサイトを作成したのですが、PCのポータルサイト(yahoo,google,msn)にてあるキーワードで検索すると一番上にPCサイトが表示されるのですが、二番目に携帯サイトが表示されます。 携帯サイトではXHTMLにて記述をしたのですが、なぜか表示されてしまします。 PCではなく携帯のポータルサイトのみに表示されるには自動振り分けなどをしたほうがよろしいのでしょうか? 記述は下記のようにしております。 <?xml version="1.0" encoding="shift_jis"?> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"> <head> <title>********</title> <meta http-equiv="cache-control" content="no-cache"/> <meta name="keywords" content="************"/> <meta name="description" content="**********"/> <meta http-equiv="content-type" content="text/html; charset=shift_jis" /> <base href="http://www.******/mobile/"> </head> ご教授お願いします。

専門家に質問してみよう