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