• ベストアンサー

PHPでの”能”などの文字化け(ファイル送信フォーム)

サーバー環境 Win2000 Apache/2.0.55 PHP Version 4.4.1 MySQL Version 3.23.49 (SJIS) php.iniの設定 magic_quotes_gpc=Off mbstring.http_input=auto mbstring.http_output=SJIS mbstring.internal_encoding=SJIS にて運用しています。 携帯での利用を考慮して、SJISでの運用が必要であったため、EUC-JPへの変更は考えていません。 能などの「文字化け文字」の表示は、addslashes,stripslashes等で処理しており問題はありません。 今回、ファイル送信<input type=file name=userfile>のファイル送信での\の処理についてお聞きしたく質問しました。 過去の例にも挙げられていますが、可能性などの文字は、SJIS環境で送信すると、可能\性と表示されます。表示は、stripslashesで\をとればいいと思いますが、上記のinput type=fileでファイルを指定すると C:\MyDocument\可能性.doc は D:\MyDocument\可能\性.doc となってしまい、パスと判断され フォームの送信後の $userfile_nameでは、「性.doc」となってしまいます。 現在のサーバー環境を変えることで大きな影響がでるのは、できるだけ避けたいです。 なにかよい意見がございましたら、ご教授ください。よろしくお願いします。

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

いろいろ調べて以下のサンプルプログラムを作ってみました accept-charsetでformの文字コードを変えて送信できます ただIEでは表示ページの文字コードに存在しない文字がないとaccept-charsetを使用しないようです。そのためにダミーのパラメータを使っています。 IE6とFireFox,Mozilla1.7では大丈夫でした。 <?php header("Content-type: text/html; charset=Shif_JIS"); echo mb_convert_encoding($_FILES['userfile']['name'], "sjis", "utf-8"); ?> <form enctype="multipart/form-data" action="" method="POST" accept-charset="utf-8"> <input type="hidden" name="dummy" value="�"><!-- IEにaccept-charsetを理解させるおまじない(^^) --> <input type="hidden" name="MAX_FILE_SIZE" value="30000"> Send this file: <input name="userfile" type="file"> <input type="submit" value="Send File"> </form>

hola1973
質問者

お礼

他の案も考えましたが、非常に影響が大きかったため、php504さんの意見を参考にスクリプトを作り直しましたところ、うまくいきました。 どうもありがとうございました。 出張&土日休みで返答が遅れましたことお詫びします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • kaz33
  • ベストアンサー率60% (20/33)
回答No.3

興味があったので色々調べてみました。 参考URLのスレッドを読んでみてください。 質問者様の悩みと同じだと思います。 そのスレッドのNo12577のプログラムを若干修正して使えば 綺麗にファイル名を取得することができましたよ(^-^ (質問者様と同じ設定[php.ini]にして実験してみました) アップロードされたファイルの中身を見るときはtmp_fileを開くと思いますが・・・ ちなみに~ 私も携帯サイトを作っていますが、 mbstring.internal_encoding=EUC-JP としてあります。 mbstring.http_output=SJIS で表示はSJIS出力になりますので、携帯でも問題なしですよ。。 プログラムをEUC-JPで書くだけです。 では~

参考URL:
http://ns1.php.gr.jp/pipermail/php-users/2003-January/thread.html#12472
hola1973
質問者

お礼

返答ありがとうございました。 ただ、mbstring.internal_encoding=EUC-JP とすると、 その他の数百のスクリプトがSJISで書かれているため影響が大であると考え、php504さんの案を採用しました。 今後、新規で作成するときは、参考にさせていただきます。 どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

ファイル名に\は使えないことになっているのでしょうがないですね。 PHP3はファイル名がフルパスで取得できたと思うのでPHP3にして自分で工夫するか(\の前の文字が0x80以上だったらその前の\までをファイル名に追加というのを繰り返す) または携帯でアップロード可能な機種は限られているのでそこだけEUCにしてしまう(自信ないですがアップロード可能な携帯はEUCが使えたような)

hola1973
質問者

補足

現在のところ、PCでのブラウザでの運用ですので、 >そこだけEUCにしてしまう というのもありかもしれません。 ただ、プログラムをSJISからEUCに変換したとしても送信時には mbstring.http_input=auto mbstring.http_output=SJIS mbstring.internal_encoding=SJIS これらの設定は、支障になることはないでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • phpの半角カタカナの文字化け

    宜しくお願いします。 phpで変数に代入した文字列が半角カタカナだとhtmlからpostで渡された一回目の表示は普通に表示されるんですが、そこから先のphpにsubmitで引き渡される際(もしくは、同じphpファイル内でsubmidで送られた際)に、代入した文字列が化けてしまいます。perlでフォーム作ってた時はこんなエラーは発生しませんでした。 携帯用のフォームとして作っているので、出来れば半角カタカナで表示できると文字列がコンパクトになるので助かるんですが・・・作ってる環境は、win2000で、サーバのphpは4.1.2-p4となっています。phpinfoで調べてみた内容は、 mbstring.detect_order auto auto mbstring.func_overload 0 0 mbstring.http_input auto auto mbstring.http_output SJIS SJIS mbstring.internal_encoding EUC-JP EUC-JP mbstring.substitute_character no value no value となっております。 何卒、アドバイスの程、宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHPの文字化けに関して

    こんにちは。 現在、PHPでWeb画面を作成しているのですが 日本語がすべて文字化けして困っています。 php.iniの設定はWebなどを参考にして以下のような 設定です。 宜しくお願い致します。 =php.iniの設定= default_charset = SJIS mbstring.http_input = auto mbstring.http_output = pass mbstring.internal_encoding = SJIS mbstring.detect_order = auto mbstring.substitute_character = none =.php内の記述= <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> =環境= サーバー:Vine Linux3.2

    • ベストアンサー
    • PHP
  • phpでの書き出しでの文字化け解消について

    お世話になります。 SJISを使いたく、php.iniを次のように設定しましたが、まったく文字が読めない状態で書き出されてしまいます。問題点をお教えいただけないでしょうか。 default_charset="Shift_JIS" mbstring.language=Japanese mbstring.internal_encoding=EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation=On mbstring.detect_order=auto また、内部円コーディングのmbstring.internal_encoding=EUC-JP はこれでよいのでしょうか。SJISを使うなら、SJISのほうがよいのでしょうか。 どなたか、お助けいただけないでしょうか。 どうか、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP 入力値 文字化け

    phpでFormで入力した値(日本語)が文字化けしてしまいます。 環境は WinXp pro apache2.0.59 php 4.4.7 php.iniのおもな設定ですが、 mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = none; ブラウザからすべてShiftJisで入力されているのですが、 それがうまく EUC-JPに内部エンコードされていません。 mb_convert_encording($str,"EUC-JP","auto")をスクリプト内で 記述するとうまく表示されますが、なんとか設定で文字化けしないよう にできないでしょうか? よろしくお願いします。

    • 締切済み
    • PHP
  • PHPの文字化け

    PHP4.3.2 Windows2000 PostgreSQL RedHat Linux DBから取得した値をCSVファイルに書き出します。 この時に日本語が文字化けをしてしまうのです。 php.iniの設定を変えれば、良いのでしょうか? 初歩的な質問で申し訳ありませんが、 よろしくお願いします。 php.iniの設定内容 default_charset = "SJIS" mbstring.language = Japanese mbstring.internal_encoding = eucJP-win mbstring.http_input = ASCII,JIS,Windows-31J,UTF-8,EUC-JP mbstring.http_output = Windows-31J mbstring.detect_order = ASCII,JIS,Windows-31J,UTF-8,EUC-JP mbstring.substitute_character = none DBの設定内容 List of databases Name | Owner | Encoding -----------+----------+---------- test | postgres | EUC_JP

    • ベストアンサー
    • PHP
  • 環境依存文字の「ハート」マークを送信すると文字化け

    フォームの入力欄に環境依存文字の「(ハート)」マークを入力し、「送信」と表示されたボタンを押すと、 画面上のボタンは全て消えてしまい、「(ハート)」マークと入力した欄には、「⊇」と表示されて他の入力欄に表示されるはずの日本語文字が文字化けした状態で表示されます。 (表示のみとなる日本語部分や半角表示部分は文字化けしていません。) 「送信」を押された場合のロジックにprint($_POST['submit']);でボタンの名称表示を入れてみると「送信」ではなく「瘧竅」と表示されます。 「送信」ボタンのhtmlソースは、次のような書き方です。 <input name="submit" value="送信" type="submit" /> ちなみに、「(ハート)」マークを入力するとハート文字の選択肢が表示されて、「(ハート)」マークの右隣には、環境依存文字(unicode)表示されます。 また「(ハート)」マーク以外の環境依存文字の(株)や普通の日本語は全く問題なく処理ができますし、「送信」押してもprint($_POST['submit']);の結果は「送信」となります。 「(ハート)」マークと入力して送信を押した場合でも、ボタンが消えず、「送信」を押しても$_POST['submit']の中身が「送信」となるようにするにはどうしたらよいのでしょうか? ■各種設定 http://hain.jp/index.php/tech-j/2007/02/13/%EF%BC%B0%EF%BC%A8%EF%BC%B0%E3%81%AE%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91のページを参考に設定しました。 (1)HTMLの<HEAD>タグ内への記述 <Meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> (2)php.iniの設定 mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = pass mbstring.http_output = pass mbstring.encoding_translation = Off mbstring.detect_order = EUC-JP,SJIS,JIS,UTF-8,ASCII mbstring.substitute_character = none; ;default_charset = "Shift_JIS" (default_charsetはコメントにしてあります。) ■環境 windows vista xampp/apache 2.2.4 PHP Version 5.2.3

    • ベストアンサー
    • PHP
  • phpで文字化け(php.ini)

    phpスプリクトはshift-jisで、文字化けしたためphp.iniをいじってみました。しかしどうやっても一定の漢字が文字化けしてしまいます。(「貼る」等…) 設定した箇所は下記の通りです(色々なサイトを回って調べた結果このような設定にしました) PHPのバージョンは4.4.1です。 default_charset = "Shift-JIS" mbstring.language = Japanese mbstring.internal_encoding = SJIS mbstring.http_input = auto mbstring.http_output = pass mbstring.encoding_translation = Off mbstring.detect_order = auto mbstring.substitute_character = none; mbstring.func_overload = 0

    • ベストアンサー
    • PHP
  • phpMyFaqでの文字化けについて

    こんにちわ。 現在、phpMyFaqを使ってナレッジベースの構築を検討している者です。 いくつかトピックスが上がっているようでしたが、私も文字化けに 悩まされております。 どなたかアドバイスを戴ければ助かります。 宜しくお願い致します。 <当方の環境> [PHP] php-5.2.6 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] mysql-4.1.22 my.ini default-character-set=sjis [OS] Windows 2003 server [phpMySQL] phpMySQL-2.0.9 なお、MySQL.exeを使って、SQL文で登録内容を確認したところ、 登録した文字は文字化けすることなく、登録ができていました。 表示時の問題でしょうか?

    • 締切済み
    • PHP
  • PHPがローカル環境でのみ文字化けする

    PHPをApache2.0上でローカルテストすると、ブラウザ表示がどうにも文字化けしてしまいます。 EUCで組んだスクリプトをmb_convert_encodingでSJISに変換して出力しているのですが、本番用のサーバーではきちんと動作するのに、ローカル環境ではブラウザがEUCと認識してしまっているようで、文字化けが発生します。 99%php.iniかapacheの設定がおかしいのですが、どこがおかしいか見てはいただけないでしょうか。 php.iniのそれっぽい部分 mbstring.encoding_translation = Off mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = Off mbstring.detect_order = auto mbstring.substitute_character = none; ;mbstring.func_overload = 0 なお、Apacheのhttpd.confにAddDefaultCharset項目はありませんでした。 特殊要因としてApacheがXAMPPの中で制御されていることなのですが、php.iniはApacheのbinディレクトリ内のものを編集しています。 以上です。 どうかよろしくお願いします。 WinXP SP3 PHP 5.28 Apache 2.0 XAMPP 1.7.0 ※ApacheとXAMPPはPleiadesにてEclipseを導入したときについてきたもの。

    • ベストアンサー
    • PHP
  • 文字化けの原因を教えてください。

    WindowsでスクリプトをEUCで保存し、シフトJISでブラウザへ出力ときの 設定として以下のようにphp.iniを設定しています。 ~php.ini~ output_buffering = On output_handler = mb_output_handler magic_quotes_gpc = Off default_charset = Shift_JIS extension_dir = C:/php/ext extension=php_mbstring.dll mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = none ~php.ini~ mb_detect_encodingでDBから取得した値の文字コードは、SJISでした。 mb_convert_encoding($dbdata,"EUC-JP","SJIS")で正しく表示されます。 iniファイルの設定のみで正しく表示するにはどのように設定するのがいいのでしょうか?それとも、このような文字コード変換は必須なのでしょうか? よろしくお願いします。 [PHP使用環境] PHP=5.1.6 OS=Windows2000 PRO webserver=apatch2.0 [DB環境(リモートサーバ)] DB=MS SQL Server2000 OS=Windows2003 server R2

    • 締切済み
    • PHP
トレイが入らない
このQ&Aのポイント
  • MFC-J5620CDWでトレイが入らなくなりました。Windowsで無線LAN接続しています。ひかり回線を使用しています。
  • 【MFC-J5620CDW】でトレイが入らなくなってしまいました。無線LAN接続しており、Windowsを使用しています。ひかり回線を利用しています。
  • トレイが入らなくなった【MFC-J5620CDW】のトラブルについて相談します。無線LAN接続でWindowsを使用しており、ひかり回線を利用しています。
回答を見る