当文件名以重音开头时,basename()失败

问题描述 投票:4回答:5

以下是显示问题的简单示例:

print basename('léquipe.jpg'); // léquipe.jpg
print basename('équipe.jpg');  // quipe.jpg

如何避免这种不一致,并确保basename()将返回整个文件名?

谢谢

php filenames
5个回答
4
投票

事实证明,这似乎是一个错误:https://bugs.php.net/bug.php?id=62119

如果第一个字符是非ASCII字符,则该字符就会消失。如果路径本身中存在非ASCII字符,则可以正常工作。

同样奇怪的是,这个问题只适用于64位PHP安装:

要解决这个问题,您可以使用PHP manual comment提供的自定义函数:

function mb_basename($file) 
{ 
    return end(explode('/',$file)); 
} 

代码来自:“(删除)dot nasretdinov at(remove)dot gmail dot com”


3
投票

使用http://php.net/manual/en/function.setlocale.php来解决这个问题。

setlocale(LC_CTYPE, 'fr_FR.utf8');

print basename('léquipe.jpg'); // léquipe.jpg
print basename('équipe.jpg');  // équipe.jpg

1
投票

试试这个(对于Windows服务器替换'/'):

function mb_basename($file)
{
  $temp = explode('/', $file);
  return end($temp);
}
print mb_basename('léquipe.jpg'); // léquipe.jpg
print mb_basename('équipe.jpg');  // équipe.jpg

1
投票

好的,稍微改一下以避免错误(在我的情况下):

function _basename($file){
    $array=explode('/',$file);
    if (is_array($array)){
        return end($array);
    }else{
        return $file;
    }
} 

请享用 ;-)


0
投票
if( !function_exists( "mb_basename")){
    function mb_basename( $file, $ext){
        $file = explode( '/', $file);
        $file = end( $file);
        if( $ext){
            $p = strripos( $file, $ext);
            if( $p !== false && $p == strlen( $file) -strlen( $ext))$file = substr( $file, 0, $p);
        }
        return $file;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.