[PHP-users 12577] Re: 〔関連〕ファイルアップロード時にファイル名が正しく扱えない問題

NAKAMURA Takeshi php-users@php.gr.jp
2003年1月16日 21:12:48 +0900


仲村@ねぼけてましたです。
下のスクリプトを実行して
 元の名前: C:\\サンプル\\テスト\\実 験\\高速バス時刻表(東京-新宿).txt
 basename: 高速バス時刻表(東京-新宿).txt
 とか、[PHP-users 12473] 小曽根賢治さんの挙げられた 化け文字一覧の一部
 変換前の名前: C:\\dir\\曾箪貼能表暴予禄兔喀媾彌.xls
 mb__basename: 曾箪貼能表暴予禄兔喀媾彌.xls
と、出ました。これで如何でしょう。(「テスト」は、半角片仮名で試しました)
ちなみに、w3m on FreeBSD
 変換前の名前: /home/ossan/高速バス時刻表(東京-新宿).txt
 mb__basename: 高速バス時刻表(東京-新宿).txt
と、こちらも化けないようです。
 日本語を使うなら mb_* で地道に行うのが良いということでしょう。
======== test.php ========
<?php
# フルパス以外は突っ込んではいけません。"" を返します。
# Perl の様に引数に OS名を与えてやれば この制限を外すことも可能です。
function mb__basename($file, $ENC){
 $file = mb_convert_encoding ($file, $ENC, 'eucjp-win, sjis-win, JIS');
 $len = mb_strlen ($file);
 # ディレクトリセパレータ(\ または /)の位置 + 1 を探す
 if(preg_match ( ",^[A-Z]:,", $file)){
 # for Windows
 $pos = mb_strrpos ($file, "\\", $ENC) + 1;
 }elseif (preg_match ( ",^/,", $file)){
 # for Unix
 $pos = mb_strrpos ($file, "/", $ENC) + 1;
 }else{
 # OS不明
 return "";
 }
 # \が最後に出てきたところから後ろを返す
 $file = mb_substr ($file, $pos, $len - $pos, $ENC);
 return ($file);
}
?>
<form post>
 <input type="file" name="postfile" size="40">
 <input type="submit" value="送信">
</form>
<?php
 if($_GET['postfile'] == "") exit;
 echo "変換前の名前: ${_GET['postfile']}<br>\n";
 $file = stripcslashes ($_GET['postfile']);
 $newname = mb__basename($file, "EUC-JP");
 echo "mb__basename: $newname\n";
?>
======== test.php ========
試した環境 php 4.2.3/Apache 1.3.27/FreeBSD 4.7-STABEL(2002年1月11日)
======= php.ini =======
; マニュアルの「例2 EUC-JP ユーザ用のphp.iniの設定」と、ほぼ同じ
; register_globals= Off の場合は スクリプトから stripcslashes の行を抜いて下さい
register_globals = On
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
----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+
 関西沖縄青年の集い がじまるの会 手伝い 一人だけの勝手に神奈川支部
 仲村 武 <1yen@sh.rim.or.jp>

AltStyle によって変換されたページ (->オリジナル) /