スレッド表示 | フラット表示〕 全トピック 920 件中 214 番目 次≫ ≪前

POSTされた文字の文字化け

created: 2006-07-19 16:03 | modified: 2006-07-27 13:18 | reply: 2

[3166] POSTされた文字の文字化け

user: ぽち | created: 2006-07-19 16:03
お久しぶりです、こんにちは。
以前FTP関数について色々と助言をいただき、その後無事ディレクトリ名を取り出すことができました^^
どうもありがとうございました。


今回は、文字化けに関しての質問です。
サイト全体を文字コードEUC-JPで作っているのですが、POSTする文字が一部(「夕」「西」「他」「村」など)文字化けを起こしてしまいます。

<?php
//---$_POST["test1"]が文字化け
echo $_POST["test1"];
?>
<br><br>
<form method="post" action="<?=$_SERVER['PHP_SELF'] ?>">
<input type="text" name="test1">
<input type="submit" value="送信">
</form>

ちなみに、<input type="text" name="test1">の下に
<input type="hidden" name="適当" value=" ">
と、valueに全角の空白を入れたものを挿入すると文字化けしなくなったりします。

この文字化けは私のローカル環境でのみ発生し、XREAなどのサーバに上げたものは文字化けしません。
なので、php.iniのどこかが間違っているんじゃないかと思うのですが、何が原因か分かりますでしょうか・・・。

PHPマニュアルの「マルチバイト文字列関数」にある、「EUC-JPユーザ用のphp.iniの設定」を参考に

-------------------------------------------

output_buffering = Off
default_charset = EUC-JP
mbstring.language = Japanese
mbstring.encoding_translation = On
mbstring.http_input = auto
mbstring.http_output = EUC-JP
mbstring.internal_encoding = EUC-JP
mbstring.substitute_character = none

-------------------------------------------

上記のようにphp.iniを書き換えました。
テスト環境でのみ起こる不具合なので、さほど急いでおりません。お時間あるときにでもお答えくだされば幸いです。

OSはWindows
PHPのバージョンは4.4.2
Apacheのバージョンは2.0.58です。
よろしくお願い致します。
reply: 3171 返信 編集 削除

[3171] Re. POSTされた文字の文字化け

user: ゆうじ | created: 2006-07-23 17:59
こんにちは。

テストコードを走らせたところ私のとこでも化けました。

設定はこんなです。
mbstring.detect_order: no value
mbstring.encoding_translation: Off
mbstring.func_overload: 0
mbstring.http_input: auto
mbstring.http_output: auto
mbstring.internal_encoding: EUC-JP
mbstring.language: Japanese


次のコードをEUCで保存して、実行すると
PHPがエンコードを誤認識してることがわかります。
文字数が少ないと起きるエンコードの誤認識が原因みたいです。
ブラウザもShift-JISと認識していますので、ダブルで誤認識です。

<?php
// ぽちさんところに合わせるため
// 出力エンコードをEUC-JPに設定
mb_http_output('EUC-JP');
?>
<form method="post" action="<?=$_SERVER['PHP_SELF'] ?>">
<input type="text" name="test1">
<input type="submit" value="submit">
</form>
<?php
echo '<div>POST: ', $_POST['test1'], ' --- ',
mb_detect_encoding($_POST["test1"]), '</div><br>';

echo '<div>夕: ', mb_detect_encoding('夕'), '</div>';
echo '<div>西: ', mb_detect_encoding('西'), '</div>';
echo '<div>他: ', mb_detect_encoding('他'), '</div>';
echo '<div>村: ', mb_detect_encoding('村'), '</div>';
?>

基本的にテスト環境の設定は、
サーバに合わせてしまうといいと思いますよ。

サーバ側で誤認識を減らすには、
mb_detect_order で自動検出の順序を調整してやるくらいでしょうか。
ただ注意が必要なのは、近頃 eucJP-win や
SJIS-win など、エンコードの種類が増えていますので、
'EUC-JP, eucJP-win, SJIS, SJIS-win, JIS, UTF-8, ASCII'
のような指定が必要です。

あと、HTMLフォームの中に、hidden で、
他のエンコードには無い文字を埋め込んでおくと、
誤認識を減らせます。


ブラウザの誤認識の方は、
HTMLヘッダ部の Content-Type 設定に加え、
他のエンコードには無い文字をHTML中に埋め込むと
ご認識が減ります。

Yahoo!JAPANではこんな具合に対処してあります。
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<!--京-->
Parent: 3166  reply: 3187 返信 編集 削除

[3187] ありがとうございます

user: ぽち | created: 2006-07-27 13:18
こんにちは。いろいろ勉強になります。

> 基本的にテスト環境の設定は、
> サーバに合わせてしまうといいと思いますよ。

こう言われて初めてそんなことに気が付きました・・w
ただ、XREAも実はテスト環境で、本番サーバは未定の状態だったのですが、XREAでは問題が無かったと言うことで、XREAの設定に合わせてみました。

前回の設定から
---------------------------------------
mbstring.http_output = pass
mbstring.encoding_translation = Off
---------------------------------------

として、あと余計なものをコメントアウトしてみたところ、1文字でも文字化けしなくなりました。

おかげで、以前はShift_JISのファイルを置くとページ全部が文字化けしていたのも直りました^^;
ガチガチにEUC-JPを指定しすぎだったんでしょうかね。


<!--京-->というのにはそんな理由があったというのも驚きです。時々どこかのソースで似たようなコメントが入ってて、なんでこんな所にこんな文字を入れてるんだろうと不思議だった覚えがあります。
色々文字化け対策されているんですね。


どうも、ありがとうございました^^
Parent: 3171  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 214 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑