アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります
携帯サイトの文字化けに困っています。

MysqlのデータはEUC-JPなので
携帯サイトにデータを出力するのにShift-JSにしないと文字化けするというところまで調べました。

function cnv_dispstr($string) {
// 文字コードを変換する
$det_enc = mb_detect_encoding($string, "Shift-JIS,EUC-JP");
if ($det_enc and $det_enc != ENCDB) {
return mb_convert_encoding($string, ENCDB, $det_enc);
}
else {
return $string;
}
}

このようにしたのですが、
Mysqlから出力したデータ部分の文字化けが解決しません。
アドバイスよろしくお願いします。

A 回答 (4件)

mbstring.internal_encoding=EUC-JP


ところでphpのソースファイルはEUC-JPで保存してますよね?これを間違ってると結局文字化けの嵐にしかならないので。
あと、SQLサーバーの方の文字コードもEUC-JPなら、SQLサーバーとのデータやりとりに文字コード変換は必要無いと思いますけど、一応そちらも確認して下さい。

mbstring.http_output = SJIS
php.iniでこの設定になっているのなら、PCに対しても携帯に対しても、ページ出力はみなShift-JISとしてしまうのが面倒がなさそうですね。
metaタグのcharset記述は、Shift_JISにしておきましょう。

この場合、先に示したマニュアルの、「例 3. SJIS ユーザ用の php.iniの 設定」のとおりになっているかをすべて確認して下さい。
    • good
    • 0
この回答へのお礼

再度ご回答有難うございます。
お騒がせしています。

>ところでphpのソースファイルはEUC-JPで保存してますよね?

NO.2様の御礼の欄に書いた時は、()内の状態で保存していました。
それを全てEUC-JPで保存し直して、
metaのcharasetをShift_JISにしましたが、
どうしても文字化けは改善しませんでした。

もう何をやってもダメだ!!とヤケになって、
charasetもEUC-JP、なにもかもEUCで統一したところ
あっさりとキレイに表示されました。
3キャリア(i-mode,au,vodafone)で確認してもばっちりでした。

一緒に考えて下さって本当に有難うございました。
まさか、自分で解決できるなんて思ってませんでした。

ところで、どこをどんなに調べても携帯はShijt-JISが当たり前だと思っていたのですが、EUC-JPで何故通用してしまったのでしょうか。謎だらけです・・・。

お礼日時:2006/07/18 03:16

>携帯サイトにデータを出力するのにShift-JS


ページ出力全部がShift-JISである必要があります。
SQLから取り出したデータは、スクリプトの記述用文字コード(mbstring.internal_encoding)にまず変換しておけば、
そのあと、mbstring.http_output = SJIS; で、ページ全体がShift-JISに変換されます。

>PCサイトと携帯サイトの両方に
ページ別に出力文字コードを変更する必要があるわけですね。
php.iniでの出力用文字コード設定は、一つしかできませんので、
「ob_start() で ob_start のコールバック関数として mb_output_handler() を指定する」
方法を取る必要があるでしょう。
頑張って、マニュアル読んで下さい。

参考URL:http://php.s3.to/man/ref.mbstring.html

この回答への補足

ご回答有難うございます。
今、マニュアルも読みながら頑張っています。
まだ良くわからない状態ですので、
少し時間がかかると思いますがちょっとでも進めば報告させてください。
すみませんが見捨てないで覗いてやって頂けると嬉しいです。
よろしくお願いします。

補足日時:2006/07/16 14:10
    • good
    • 0
この回答へのお礼

すみません、教えてください。

php.iniを開いてみました。
mbstring.internal_encoding = EUC-JP
mbstring.http_output = SJIS
になっています。
output_handler = mb_output_handler
↑このようにしました。

あとは携帯ページの方をすべて
Shift-JISで統一しておいた方が良いのでしょうか。

よろしくお願いします。

お礼日時:2006/07/16 15:13

確認はPCでされているのでしょうか


文字化けはshift jisがeuc-jpで表示されているのかeuc-jpがshift jisで表示されているのかどっちでしょうか
ブラウザのエンコードを変えて確認してください
それとphpinfo()でmbstringの設定を確認して教えてください

この回答への補足

すみません、mbstringの設定ですが
多分これだと思います

Multibyte Support enabled
Japanese support enabled
Simplified chinese support enabled
Traditional chinese support enabled
Korean support enabled
Russian support enabled
Multibyte (japanese) regex support enabled

mbstring.detect_order no value no value
mbstring.encoding_translation Off Off
mbstring.func_overload 0 0
mbstring.http_input pass pass
mbstring.http_output pass pass
mbstring.internal_encoding no value no value
mbstring.language Japanese Japanese
mbstring.script_encoding no value no value
mbstring.substitute_character no value no value

補足・御礼の順番がむちゃくちゃなのですが、
このレスが最新です。
現在は
----------------------------------
function cnv_dispstr($string) {
// 文字コードを変換する
$det_enc = mb_detect_encoding($string, "SJIS");
if ($det_enc and $det_enc != ENCDB) {
return mb_convert_encoding($string, $det_enc);
}
else {
return $string;
---------------------------
↑この状態で、ページ全てが文字化けしていたのが
一部(3箇所ほど)文字化けに減りました。
同じ文字のDB出力部分で"円"が円で表示される部分とア゜になる所とあります。同じ 円 なのにどうしてなのでしょうか。
英数字は正常に表示されています。
かな・漢字の一部が化けています。

試しにフォーム内容を送信してみると
DBの文字が化けるようになりました(涙)
送信時の文字もshift-jisになってしまったのですよね、きっと。

ヒントだけでも結構ですので、
アドバイスよろしくお願いします。

補足日時:2006/07/16 19:16
    • good
    • 0
この回答へのお礼

再度有難うございますm(_ _)m

確認はPCと携帯3機種で行いました。
色々とeuc-jp、shift-jisと部分的に変えて見たりもしました。
ファイルがたくさんあるので、その設定による文字化けの原因が異なります。ファイルごとの設定と一緒にお知らせします。
---------------------------------------
    date.php(euc)
|(PC)         |(ktai)
sup.php(euc)     sup3.php(euc)
 sup.html(euc)     sup3.html(shift)
|            |
form.php(euc)    form3.php(euc)
sin.html(euc)     sin3.html(shift)
|             |
sincon.html(euc)    sincon3.html(shift)
|             |
end.html(euc)      end3.html(shift)
--------------------------------------------
現在この状態で、DBから呼び出したデータの部分のみ euc-jpがshift-jisで表示されている為文字化けしていると思います。
携帯の方のphpファイルをshift-jisにすると、全体が化けてしますので、eucとshift-jisと混在する形になっています。

先の御礼の欄で書いたソースは、
PCと携帯それぞれのsup.php、form.php 計4ファイルに入っています。
設定の部分は一番上のdate.phpにのみ入っています。

phpinfo()のmbstringの設定確認ですが、すみません、まだphp1ヶ月の初心者なのでよくわかりませんでした。
環境は、ロリポップのレンタルMysqlを使用です。
ブラウザ上でphpinfo()のページを開いてみましたが何も設定されていなさそうな雰囲気でした。
使い方が間違ってるようにも思います(T▽T)

どうぞよろしくお願いします。

お礼日時:2006/07/15 19:56

文字コードがわかっているなら


$string = mb_convert_encoding($string, "sjis", "euc-jp");
と明示した方が誤判定も防げると思います。
    • good
    • 0
この回答へのお礼

ご回答有難うございます。
$string = mb_convert_encoding($string, "sjis", "euc-jp"); とか
$string = mb_convert_encoding($string, "sjis ,euc-jp"); とか
$string = mb_convert_encoding($string, "euc-jp,sjis"); とか
思いつく限り並べ方を変えたりShift-JIS←→SJISに変えてみたのですが、解決しませんでした。
他の所に原因があるのでしょうか?
PCサイトと携帯サイトの両方に同じDBからデータを取り出したいのですが、PCはEUCで、携帯はSjift-JISで、というようにしたいです。
設定は
-----------------------------
//表示文字コード
define("ENCDISP", "EUC-JP");
//データベース文字コード
define("ENCDB", "EUC-JP");
-----------------------------
↑になってます。

もしよろしければ、再度ご回答頂けると有難いです。
あつかましいお願いですがよろしくお願いします。

お礼日時:2006/07/15 08:42

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