php的一些小函数,尤其是文件系统的小函数,总是有一些不能正常处理中文的情况发生,在使用的时候要注意了,要么尽量避免使用中文文件名,要么自己写一些放心的小函数替代他们。今天又发现了一个,pathinfo在处理带有英文连字符“-”的中文文件名时,得到的结果是错误的,比如如下代码:
php -r “print_r(pathinfo(‘test-str.txt’));”
Array
(
[dirname] => .
[basename] => test-str.txt
[extension] => txt
)
php -r “print_r(pathinfo(‘中文-测试.txt’));”
Array
(
[dirname] => .
[basename] => -测试.txt
[extension] => txt
)
可以看到,当连字符“-”出现在英文文件名当中时是没有问题的,但如果文件名是非英文字符,pathinfo函数返回的结果就有可能出现错误。pathinfo的在线手册上还列出了另外一个错误,看代码吧:
php -r “print_r(pathinfo(‘./fwolf.com/’));”
Array
(
[dirname] => .
[basename] => fwolf.com
[extension] => com
)
不分青红皂白只用最后一个点来判断扩展名extension,同样的错误还适用于xxx.tar.gz等包含有多个.的文件名,不过倒也可以接受。
所以只能用自己的方式来取了:
$filename = ‘/home/fwolf/中文-测试.tar.gz’;
$dirname = substr($filename, 0, strrpos($filename, ‘/’));
$basename = substr($filename, strrpos($filename, ‘/’) + 1);
$extension = substr(strrchr($filename, ‘.’), 1);
$filename = substr($basename, 0, strrpos($basename, ‘.’));
运行环境:Ubuntu 6.06, php cli version 5.1.2