こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

携帯サイト制作をしておりまして、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"?>
をつけると何も出力されなくなるのはなぜでしょう?

投稿日時 - 2010-06-19 15:17:57

QNo.5979865

すぐに回答ほしいです

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

mb_output_handler をつかったエンコーディングの自動変換は、content-typeがtext/htmlの時に動くという成約があった記憶があります(そうしないとバイナリまで変換しちゃうから)。

これが謎1の答えで、エンコーディングに食い違いがあるので謎2も釣られてダメになるではないかと。

投稿日時 - 2010-06-21 09:09:03

お礼

ご回答いただきましてありがとうございます!

再度PHPマニュアルを見返してみましたところ以下のような記述がありました。

---------------
注意: PHP 4.3.0 以降において、 イメージのようなバイナリデータを PHP スクリプトから出力したい場合、 バイナリデータを送信する前に header() により Content-Type: ヘッダ(例:header("Content-Type: image/png"))を 送信する必要があります。Content-Type: ヘッダが送信されると出力文字 コード変換は無効となります。
ただし、header() により"Content-Type: text/*" を送信した場合には、テキストが送信されるとみなし、文字コード設定に 基づいて出力文字コード変換を行います。
---------------

おっしゃる通りでした。
早速試してみたいと思います。ありがとうございます!

投稿日時 - 2010-06-21 11:27:23

ANo.1

このQ&Aは役に立ちましたか?

11人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問