[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>