ここから本文です

解決済みの質問

PHPでのファイル書き込み時の文字化けについて

ina_akahoriさん

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);

違反報告

ベストアンサーに選ばれた回答

qoogen_case314さん

不正なエンコーディングだと怒ってるので、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

この質問は投票によってベストアンサーが選ばれました!

この質問・回答は役に立ちましたか?
役に立った!

お役立ち度:お役立ち度 3点(5点満点中)4人が役に立つと評価しています。

知恵ノートとは?

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。

お客様自身の責任と判断で、ご利用ください。

話題のキーワード

[カテゴリ:PHP]

ただいまの回答者

16時44分現在

3137
人が回答!!

1時間以内に5,794件の回答が寄せられています。

>>回答ひろばに行く


知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する