如果文件名是UTF-8,则使PHP pathinfo()返回正确的文件名

Zsu*_*sub 32 php utf-8 pathinfo

pathinfo()已知为UTF-8的文件名上使用PHP 函数时,除非特殊字符前面有"普通"字符,否则它不会返回正确的值.

示例:
pathinfo('aä.pdf')退货:

Array
(
[dirname] => [the dir]
[basename] => aä.pdf
[extension] => pdf
[filename] => aä
)  
Run Code Online (Sandbox Code Playgroud)

这是好的和花花公子,但pathinfo('äa.pdf')返回:

Array
(
[dirname] => [the dir]
[basename] => a.pdf
[extension] => pdf
[filename] => a
)  
Run Code Online (Sandbox Code Playgroud)

这不是我所期待的.更糟糕的是,pathinfo('ä.pdf')回报:

Array
(
[dirname] => [the dir]
[basename] => .pdf
[extension] => pdf
[filename] => 
)  
Run Code Online (Sandbox Code Playgroud)

为什么这样做?这适用于我测试的所有重音字符.

小智 11

在使用pathinfo之前

setlocale(LC_ALL,'en_US.UTF-8');
pathinfo($OriginalName, PATHINFO_FILENAME);
pathinfo($OriginalName, PATHINFO_BASENAME);
Run Code Online (Sandbox Code Playgroud)

  • 如果您要添加一些解释和文档链接,答案可能会变得更有价值,因此原始海报和其他用户实际上可以从中学习. (2认同)

Tim*_*nen 10

我在PHP 5.3.3 - 5.3.18中使用了这些函数来处理basename()和pathinfo()中的UTF-8问题.


if (!function_exists("mb_basename"))
{
  function mb_basename($path)
  {
    $separator = " qq ";
    $path = preg_replace("/[^ ]/u", $separator."\$0".$separator, $path);
    $base = basename($path);
    $base = str_replace($separator, "", $base);
    return $base;
  }
}
if (!function_exists("mb_pathinfo"))
{
  function mb_pathinfo($path, $opt = "")
  {
    $separator = " qq ";
    $path = preg_replace("/[^ ]/u", $separator."\$0".$separator, $path);
    if ($opt == "") $pathinfo = pathinfo($path);
    else $pathinfo = pathinfo($path, $opt);

    if (is_array($pathinfo))
    {
      $pathinfo2 = $pathinfo;
      foreach($pathinfo2 as $key => $val)
      {
        $pathinfo[$key] = str_replace($separator, "", $val);
      }
    }
    else if (is_string($pathinfo)) $pathinfo = str_replace($separator, "", $pathinfo);
    return $pathinfo;
  }
}


Zsu*_*sub 7

这个问题的临时解决方法似乎是确保重音字符前面有一个"正常"字符,如下所示:

function getFilename($path)
{
    // if there's no '/', we're probably dealing with just a filename
    // so just put an 'a' in front of it
    if (strpos($path, '/') === false)
    {
        $path_parts = pathinfo('a'.$path);
    }
    else
    {
        $path= str_replace('/', '/a', $path);
        $path_parts = pathinfo($path);
    }
    return substr($path_parts["filename"],1);
}
Run Code Online (Sandbox Code Playgroud)

请注意,我们将所有出现的'/'替换为'/ a',但这没关系,因为我们从结果的偏移量1开始返回.有趣的是,这dirname部分pathinfo()似乎确实有效,因此那里不需要解决方法.

  • 这仍然是2016年的一个错误,但是`setlocale(LC_ALL,'en_US.UTF-8');`有效. (2认同)