解決済みの質問
PHPでのファイル書き込み時の文字化けについて
PHPでのファイル書き込み時の文字化けについて
htmlのフォームから入力したテキストを、phpでファイルに出力するプログラムを作っているのですが、
どうしても文字化けが起こってしまいます。
色々試して、htmlの文字コードをEUCにするといいとのことで、charsetをShift-JisからEUCに変え、
文字コードをEUCで保存しなおしました。
すると、5回に1回くらいは文字化けせずに書き込めるのですが、九回は
警告 warning:mb_convert_encoding() [function.mb-convert-encoding]: Illegal character encoding specified
となり、文字化けしてしまいます。
ソースに、受け取ったテキストの文字コードを出力するデバッグ文を入れてみたのですが、送信されてきたテキストはEUC-JPだったりUTF-8だったり、まちまちです。EUC-JPで送信されてきた場合はきちんと書き込めるのですが・・・・
htmlのcharsetをEUCにするだけではだめなんでしょうか?
5回中5回だめなら納得もいくのですが、なんでたまに成功するんでしょうか・・・。
それと、htmlの文字コードをShift-JISのまま、文字化けせずに送信することは無理なんでしょうか?
PHPのフリーツールを配布しているサイトさんで、似たようなファイル出力をするプログラムをもらってきて、どうやってるのか見てみようかと思ったんですが、htmlがshift-jisだとやはり文字化けしてしまいます。
phpもhtmlも、同じようなコードでしたし・・・。
長くてすみません、ここがいけない、みたいなのがあったらヒントだけでもいただけないでしょうか。
よろしくお願いします。
↓
■htmlファイル
<META http-equiv="Content-Type" content="text/html; charset=EUC-JP">
(略)
<FORM name="sendform" action="send.php" method="post">
<INPUT size="50" type="text" name="message" value="">
<INPUT type="submit" name="dosend" value="submit">
</FORM>
:
■send.php
$innerEncoding = mb_internal_encoding();
print("送信文字エンコーディング >>".mb_detect_encoding($_POST["message"])."<br>");
if($_POST["message"]){
$mes = mb_convert_encoding($_POST["message"], "EUC-JP", mb_detect_encoding($_POST["message"]));
}
//ファイル書き込み
$data = file("ファイルパス");
array_unshift($data, $mes);
$fpoint = fopen("ファイルパス", 'w');
flock($fpoint, LOCK_EX);
foreach($data as $val){
fwrite($fpoint, $val);
}
flock($fpoint, LOCK_UN);
fclose($fpoint);
-
- 質問日時:
- 2007/10/27 15:36:43
-
- 解決日時:
- 2007/11/11 03:04:36
-
- 回答数:
- 1
-
- お礼:
- 知恵コイン
- 25枚
-
- 閲覧数:
- 8,835
-
- ソーシャルブックマークへ投稿:
- Yahoo!ブックマークへ投稿
- はてなブックマークへ投稿
- (ソーシャルブックマークとは)
ベストアンサーに選ばれた回答
不正なエンコーディングだと怒ってるので、mb_detect_encodingをどうにかすればいいじゃないですか
実際の実装よりは簡易ですけど、私はこんな感じで文字セットを処理してます
function getEncodingType($data)
{
$encodingArray = array("ISO-2022-JP","UTF-8","Shift_JIS","EUC","ASCII");
$n = 0;
while($focusEncoding = $encodingArray[$n])
{
if(mb_check_encoding($data,$focusEncoding)) return $focusEncoding;
$n++;
}
return "nil";
}
付属の関数(mb_detect_encodingだったかな)で取得すると正しいエンコーディングを取得出来ないので造りました。
これで日本語圏で使われるエンコーディングはだいたい正確に取得出来ます。
文字セットの特性を利用した順序にしてます。
$stringが変換したい文字列、$encodingが変換するエンコーディングなら、次でokかと。
$string = mb_convert_encoding($string,$encoding,getEncodingType($string));
多分統一したエンコーディングに変換出来ます。。。
実装ではString Objectなどとして利用してるので、もっと簡易です。
これでもとのエンコーディングをあまり意識せずにデータ処理できてます。
エラー処理だとかも適当に追加して下さい。
追記: mb_convert_encodingのバグは結構有名なようです。原因はこれでしょうね
- 違反報告
- 編集日時:2007/10/30 00:34:23
- 回答日時:2007/10/28 02:20:47
この質問は投票によってベストアンサーが選ばれました!
- この質問・回答は役に立ちましたか?
- 役に立った!
お役立ち度:
4人が役に立つと評価しています。

