WEBサーバーの設定について質問ですが

mbstring.http_output = passにするとモバイルページは表示されますがPCページが文字化けします
mbstring.http_output = EUC-JPにすると逆にPCページは表示OKでモバイルページが文字化けします
以下現状設定ですがヒントでもいただければ幸いです。
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = EUC-JP
mbstring.http_input = auto
mbstring.http_output = EUC-JP
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = EUC-JP;

回答の条件
  • URL必須
  • 1人10回まで
  • 登録:2007/12/06 16:28:19
  • 終了:2007/12/13 16:30:03

回答(2件)

id:tezcello No.1

tezcello回答回数460ベストアンサー獲得回数692007/12/06 16:57:29

ポイント35pt

Webサーバではなく、PHP(php.ini)の設定ですね。

一般に携帯は Shift-JIS である事を期待しているようです。

mbstring.http_output = pass

でモバイルページが正常なら、PHPから書き出されるHTMLデータのエンコードが Shift-JIS になっているのではありませんか?

(PHPスクリプトを記述しているエンコードなども)

そして、その状態でPCページが文字化けするのは、Webサーバで出力している httpヘッダ、HTML中のメタタグでのエンコード指定が、ブラウザに送られてくる実際のエンコードと一致していないのでは?


状況を把握するのに、以下を教えていただけませんか?(ご自分で確認するだけで解決するかもしれませんが)

PHPスクリプト(やスクリプトで読み込む書類)のエンコードは何でしょう?

Webサーバのデフォルトエンコードは何になっているでしょうか?

  Apache なら、httpd.conf の AddDefaultCharset の値(デフォルトではUTF-8だったかな)

メタタグでエンコードの指定をしていますか?

PCで文字化けする時、使っているブラウザは何でしょうか?

PCで文字化けしている時に、ブラウザのエンコード(文字コード)を何にすると正常に見る事ができますか?


直接今回の回答にはなりませんが、php.ini 設定の例 が載っています

http://www.php.net/manual/ja/ref.mbstring.php

id:kaji0245

>PHPスクリプト(やスクリプトで読み込む書類)のエンコードは何でしょう?

>Webサーバのデフォルトエンコードは何になっているでしょうか?

php.ini内にて下記の表示がありました。

default_charset = "Shift_JIS"

httpd.conf内には↓の表示が数多くありますがAddDefaultCharsetの表示はありませんでした。

AddCharset *****

>PCで文字化けする時、使っているブラウザは何でしょうか?

FFです。ちなみにIEでは真っ白になります。

>PCで文字化けしている時に、ブラウザのエンコード(文字コード)を何にすると正常に見る事ができますか?

どれにしても正常にはみれません(ToT)

2007/12/06 17:30:31
id:tezcello No.2

tezcello回答回数460ベストアンサー獲得回数692007/12/06 23:23:13

ポイント35pt

説明が足らずに申し訳ないです。

> >PHPスクリプト(やスクリプトで読み込む書類)のエンコードは何でしょう?

> >Webサーバのデフォルトエンコードは何になっているでしょうか?

> php.ini内にて下記の表示がありました。

phpの設定をお尋ねしたのでは無く、phpプログラム(といった方が分かり易いでしょうか)を書く時にどんな文字コードを使われたかが知りたかったのです。

<?PHP ・・・?>が書かれている○○○.phpというファイルです。


因に

> default_charset = "Shift_JIS"

が書いてあると、ここに記述したエンコードをヘッダで出力するそうです。

http://www.php.net/manual/ja/ini.core.php#ini.default-charset


どのようなサーバ環境かは分かりませんが、デフォルトからかなり変更されていませんか?

default_charset = "Shift_JIS"

があるのに

mbstring.http_output = EUC-JP

となっているのは矛盾を感じます。普通のディストリビューションでこのような設定になっているとは思い難いです。


> httpd.conf内には↓の表示が数多くありますがAddDefaultCharsetの表示はありませんでした。

その付近にコメントで、デフォルトはUTF-8であるとか書いてありませんか?

コンソールなどで、

apachectrl fullstatus

とコマンドを打つとずらずらっと現在の設定内容を表示してくれるようです。

その出力にデフォルトのキャラクタセットが載っていると思います。


> >PCで文字化けする時、使っているブラウザは何でしょうか?

> FFです。ちなみにIEでは真っ白になります。

IE で真っ白という事は、メタタグでエンコードを指定していないのでしょうね。

やっぱり、文字コード(エンコード)がおかしくなっているような気がします。

実際にサーバから送られて来たHTML文書としてのエンコード、HTTPヘッダの内容、PHPの内部処理等の設定に不整合があるのではないでしょうか。


> >PCで文字化けしている時に、ブラウザのエンコード(文字コード)を何にすると正常に見る事ができますか?

> どれにしても正常にはみれません(ToT)

mbstring.encoding_translation = On

mbstring.http_output = EUC-JP

mbstring.internal_encoding = EUC-JP

となっていて、更にPHPプログラム(あるいはHTML書類)がShift-JISになっている(と予想します)

ので、

Shift-JIS文字列をEUC-jpだと思い込んで変な変換をしているなどが起きているような気がします。


サイト全体の事なので、どのような設定にするかは、オーナーさんのポリシーで自由なんですが、

僕は、この先XMLが使われる事が多くなるだろうと予想しているので、基本はUTF-8で書くようにしています。(スクリプトも、データも、HTML文書も)

で、入出力の際に勝手に変換をされると、間違いに気づかない可能性があるのでHTTPの入出力は pass に、

当然その流れから、自動変換(mbstring.encoding_translation) も無効に。

携帯用に出力する場合は、全出力内容が入っている変数の中身をShift-JISに変換してから出力。

のようにしています。


今のphp.iniの設定は、(この辺りはデフォルトから変更していなかったと思うけどなぁ)

mbstring.encoding_translation Off

mbstring.func_overload 0

mbstring.http_input pass

mbstring.http_output pass

mbstring.internal_encoding no value

mbstring.language neutral

mbstring.substitute_character no value

となっていて、普段PHPプログラムを書く時は最初の方で、決まり文句としてこんなのを入れています。

define(SITE_LANG,'ja');	
define(SITE_CHARSET,'UTF-8');

set_magic_quotes_runtime(false);
mb_http_output("pass");
mb_internal_encoding(SITE_CHARSET);
mb_language(SITE_LANG);
mb_regex_encoding(SITE_CHARSET);
header("Content-Type: text/html; charset=".SITE_CHARSET);

一旦定数にしてから設定しているのは、他でも使うかもと思っただけですから気にしないで下さい。

id:kaji0245

ありがとうございます。/mobile以下に下記を記述することにより

文字化けは直りました。

どうしても漢字が化けてしまう部分が1箇所↓だけあり原因不明ですがローマ字"Reserve"に変更しました。

$system->MakeLink(1,"Reserve",$system->installation."Phase1.php?hcnt=1");

>define(SITE_LANG,'ja');

>define(SITE_CHARSET,'Shift-JIS');

>set_magic_quotes_runtime(false);

>mb_http_output("pass");

>mb_internal_encoding(SITE_CHARSET);

>mb_language(SITE_LANG);

>mb_regex_encoding(SITE_CHARSET);

>header("Content-Type: text/html; charset=".SITE_CHARSET);

2007/12/07 08:48:26
  • id:tezcello
    一応の解決があったようで、おめでとうございます。

    > どうしても漢字が化けてしまう部分が1箇所↓だけあり原因不明ですがローマ字"Reserve"に変更しました。
    > $system->MakeLink(1,"Reserve",$system->installation."Phase1.php?hcnt=1");
    文字列を書く場合、改行等の制御文字を含まないのなら、” ではなく、’ で括った方がいいでしょうね。
    特に、Shift-JIS で書くときは、文字コードの中にバックスラッシュ(日本では¥マーク)を含む文字があるので、” で括ると文字化けの原因になります。
    http://www.psl.ne.jp/perl/pdojo00c.html

    こういうことに気を使わなければならないのも、Shift-JIS が推奨されない理由の一つです。
    正規表現系の関数が使えないのも多くありますし。

    http://www.php.net/manual/ja/ref.mbstring.php
    によれば、
    >>JIS, SJIS, ISO-2022-JP, BIG-5 は PHP で動作しないと思われる文字エンコーディング<<
    とされていて、
    >>SJIS, BIG5, CP936, CP949, GB18030 は、読者がパーサ/コンパイラ、 文字エンコーディングと文字エンコーディングの問題点について精通していない限り 内部エンコーディングとして使用するべきではありません。<<
    だそうです。
  • id:kaji0245
    アドバイスありがとうございます。
    'に変更したのですがやはりダメでした。他に原因があるようです。
    別ファイルに気になる記述がありました↓
    //文字コード変換
    function EUC2SJIS($tpl_output) {
    return mb_convert_kana(mb_convert_encoding($tpl_output, "SJIS", "EUC-JP"),"KV","SJIS");
  • id:tezcello
    名前からすると、EUC を Shift-JIS に変換する関数のようで、変換前のエンコードが EUC-JP と決め打ちになっているのは問題無いと思います。
    ですが、この関数がどういった場面で呼ばれるのかは問題になる可能性が高いです。

    なかなか答えていただけませんが、PHPプログラムを書いているファイル、そのプログラムで読み書きするファイルのエンコードが Shift-JIS であるとすると、EUC に変換する場面はあまりないはず。
    (正規表現での処理をしようとして、変換しているかも知れませんが)

    $tpl_output の内容は、どのようにセットした値で、その値のエンコードは何になっているのか。
    上記の各種ファイルが Shift-JIS で書かれていて、内部エンコードも Shift-JIS なら、この処理を通ったとたん文字化けします。

    いま使おうとしているPHPプログラムは、各種ファイルのエンコードが EUC である事(または、内部エンコードが EUC でHTTP入力や自動変換がONである事)が前提になっていませんか?
    この関数が用意されているという事は、内部の処理その他は全て EUC でやって、最後に Shift-JIS に変換してから出力する仕組みになっているような気がします。
  • id:kaji0245
    phpプログラムはeuc形式で保存しましたが?(こういうことではないのでしょうか?)
    コンソールなどで、apachectrl fullstatusとコマンドを打ってもだめでした。
    Solarisだからでしょうか?
  • id:tezcello
    > phpプログラムはeuc形式で保存しましたが?(こういうことではないのでしょうか?)
    了解です。(これが聞きたかったんです)

    > ありがとうございます。/mobile以下に下記を記述することにより
    > (略)
    /mobile 以下も EUC であると思います。
    でしたら、
    >define(SITE_CHARSET,'Shift-JIS');
    は、Shift_JIS ではなく EUC-JP であるべきだと思います。
    これで文字化けは直りませんか?(文字列は出来るだけ ' で括った方がいいのは同じです)

    また、携帯向けに最終的には Shift_JIS で出力するのでしょうから、
    >header("Content-Type: text/html; charset=".SITE_CHARSET);
    は削除した方がいいでしょう。実際と異なるヘッダを出してしまう事になります。(携帯の方で無視するかも知れませんが)
    ヘッダを出すのなら、実際に即した
    header("Content-Type: text/html; charset=Shift_JIS");
    でしょう。

    php.ini の
    default_charset = "Shift_JIS"
    は、自分でヘッダを出すのなら、この設定はしない(=""" にしておく)方が良いと思います。PC用の出力は EUC-JP のようなので矛盾しますし。

    > > httpd.conf内には↓の表示が数多くありますがAddDefaultCharsetの表示はありませんでした。
    > その付近にコメントで、デフォルトはUTF-8であるとか書いてありませんか?
    コンパイルによって違うようです。ごめんなさい。
    本来の設定では、AddDefaultCharset は デフォルトで off になっていて、ヘッダにエンコードを出さないようになっていました。
    http://httpd.apache.org/docs/2.2/mod/core.html#adddefaultcharset

    > コンソールなどで、apachectrl fullstatusとコマンドを打ってもだめでした。
    > Solarisだからでしょうか?
    かも知れません。
    man httpd
    などとして、マンページで確認された方がいいようです。(手元にはSolarisはありませんので分かりません)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません