こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ファイルのアップロードで文字化けします

ファイルのアップロードを行うと特定文字以降の名前が消えてしまいます。
(予、表など2バイトコードに5Cが含まれる文字)
コードは下のように書いています。
<form enctype="multipart/form-data" action="upload_fnc.php" method="POST">
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
<input name="userfile" type="file">
<input type="submit" value="Send File">
</form>

サーバの動作環境はLinux(FedoraCore3)、Apache2.0.52、PHP4.3.10です。
クライアント側はほとんどがWindows(2000、XP)です。

どのようにして対処すればよいか分からなく困っています。
どなたかお分かりの方がいらしたら教えてください。
よろしくお願いいたします。

投稿日時 - 2005-09-13 11:14:15

QNo.1646159

すぐに回答ほしいです

質問者が選んだベストアンサー

5Cの取り扱いなのですが、文字コードによっては
バックスラッシュ(\)として扱われてしまうと思います。
原因は、スクリプト自身の文字コードの可能性が高そうです。
EUCではその問題は出ないと思いますので、EUCをオススメします。
スクリプトを保存する際、

「名前を付けて保存」→「エンコードの種類」→「日本語(EUC)」

として保存すれば大丈夫だと思います。(秀丸エディタの場合)
試していないので分かりませんが、多分大丈夫だと思います。
あとは詳しい人に譲ります^^

もし駄目だったら、文字コード関係を考えたほうがいいと思います。
サーバの文字コード(php.ini)
アップロードするファイルの文字コードなど

投稿日時 - 2005-09-14 10:58:30

お礼

回答ありがとうございます。

charsetをEUC-JPにすることにより、5Cを含む文字列のデータ抜けがなくなりました。
問題が解決でき非常に嬉しいです。

ただ、今までのwebページやSQLデータをSHIFT-JISで作っているのでここだけEUC-JPで作成するのは、若干いやらしい感じがします。

サーバがLinuxなのでEUC-JPで作ろうかも考えたのですが、クライアント側がほぼWindowsなのでSJISに統一してしまいました。構想段階のミスでもあります。

ひとまずこれで解決ですが、最終的にはご指摘のように文字コードの設定で解決したいと思います。
アップロードするファイルはクライアント側なので変更できないので、サーバ側の設定で対処したいと思います。
現状ではこの問題以外、WindowsからでもLinuxからでも文字化けの起きないよう設定になっています。
今回のような不具合はapacheの設定なのか、phpの設定なのか分からないでおります。
もし、ご存知であればご教授お願いいたします。

ご回答、ありがとうございました。

投稿日時 - 2005-09-14 11:57:16

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

ANo.1の者です。
問題が解決できてよかったです^^

おそらくwipeさんの環境は、
PHPの内部文字コードがEUCなのではないでしょうか。
その場合、入ってくるデータは全てEUCだとサーバが思い込むので、
今回の事例のように5Cを(\)と勘違いしてしまったのだと思います。

今回は、ファイルのアップロードの際の不具合ということを考えると、
PHPの内部エンコーディングの可能性が高いのではないでしょうか。
Apacheはあくまでブラウザに対しての出力時のエンコーディングだと思いますので。

文字コードの問題で、このような不具合が起こる場合が多いので、
こんな風に統一してみたらいかがでしょうか。

Apacheの文字コード:SJIS
httpd.confを編集

 AddDefaultCharset shift_jis
 LanguagePriority ja en da nl et fr de el it kr no pl pt pt-br ltz ca es sv tw

PHPの文字コード:SJIS
php.iniを編集

 [mbstring]
 mbstring.language = Japanese
 mbstring.internal_encoding = SJIS
 mbstring.http_input = auto
 mbstring.http_output = SJIS
 mbstring.encoding_translation = On
 mbstring.detect_order = auto
 mbstring.substitute_character = none;

DBの文字コード:SJIS
スクリプトの文字コード:SJIS
アップロードファイルの文字コード:SJIS

としておけばまず問題ないと思います。
おそらくwipeさんの環境は、mbstring.internal_encoding = EUC-JP
などになっているのではないでしょうか。
SJIS以外使うことが無いのでしたら、これでOKだと思います。
試していないので、間違えていたらごめんなさい^^

投稿日時 - 2005-09-14 15:16:10

お礼

度重なる回答ありがとうございます。

ご指摘の通りapache、phpの設定を変更いたしました。
変更前の設定は以下の通りでした。

 httpd.conf
  #AddDefaultCharset shift_jis
  LanguagePriority ja en da nl et fr de el it kr no pl pt pt-br ltz ca es sv tw

 php.ini
 [mbstring]
  mbstring.language = Japanese
  mbstring.internal_encoding = SJIS
  ;mbstring.http_input = auto
  mbstring.http_output = SJIS
  ;mbstring.encoding_translation = On
  ;mbstring.detect_order = auto
  mbstring.substitute_character = none;

残念ながら結果は以前と同様でした。
(「今週の予定.txt」をアップロードすると「定.txt」 予=975C)

文字コードがSJISに固定されてしまったため、EUCで書かれたコードが文字化けしますがそれ以外は特に変化はみられませんでした。

不具合の原因が何によるものなのか分からないので、何をどうすれば分からないのですが、
私の知識不足でもあるので、もう少し勉強させていただきます。

また、何か解決策をご存知でしたらご教授お願いいたします。
回答ありがとうございました。

投稿日時 - 2005-09-14 16:31:51

あなたにオススメの質問