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

2022-08-30 13:10:22

当在已知为 UTF-8 的文件名上使用 PHP 的函数时,它不会返回正确的值,除非特殊字符前面有“正常”字符。pathinfo()

示例:
返回:pathinfo('aä.pdf')

Array
(
[dirname] => [the dir]
[basename] => aä.pdf
[extension] => pdf
[filename] => aä
)  

这很好,很花哨,但返回:pathinfo('äa.pdf')

Array
(
[dirname] => [the dir]
[basename] => a.pdf
[extension] => pdf
[filename] => a
)  

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

Array
(
[dirname] => [the dir]
[basename] => .pdf
[extension] => pdf
[filename] => 
)  

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


答案 1

使用前路径信息

setlocale(LC_ALL,'en_US.UTF-8');
pathinfo($OriginalName, PATHINFO_FILENAME);
pathinfo($OriginalName, PATHINFO_BASENAME);

答案 2

我在 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;
  }
}

推荐