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

NAKAMURA Takeshi php-users@php.gr.jp
Thu, 16 Jan 2003 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>