35

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] => 
)  

なぜこれを行うのですか?これは、私がテストしたすべてのアクセント付き文字に当てはまります。

4

7 に答える 7

17

パス情報を使用する前に

setlocale(LC_ALL,'en_US.UTF-8');
pathinfo($OriginalName, PATHINFO_FILENAME);
pathinfo($OriginalName, PATHINFO_BASENAME);
于 2016-02-13T16:56:51.047 に答える
10

これらの関数を PHP 5.3.3 - 5.3.18 で使用して、basename() と pathinfo() で UTF-8 の問題を処理しました。

if (!function_exists("mb_basename"))
{
  関数 mb_basename($path)
  {
    $separator = "qq";
    $path = preg_replace("/[^ ]/u", $separator."\$0".$separator, $path);
    $base = ベース名($パス);
    $base = str_replace($separator, "", $base);
    $ベースを返します。
  }
}
if (!function_exists("mb_pathinfo"))
{
  関数 mb_pathinfo($path, $opt = "")
  {
    $separator = "qq";
    $path = preg_replace("/[^ ]/u", $separator."\$0".$separator, $path);
    if ($opt == "") $pathinfo = pathinfo($path);
    そうでなければ $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);
    $pathinfo を返します。
  }
}
于 2013-04-05T06:46:13.830 に答える
8

この問題の一時的な回避策は、次のように、アクセント付きの文字の前に「通常の」文字があることを確認することです。

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);
}

「/」のすべての出現を「/a」に置き換えますが、結果のオフセット 1 から始まるので、これは問題ありません。興味深いことに、 のdirname部分はpathinfo()機能しているように見えるため、回避策は必要ありません。

于 2010-12-16T09:33:48.913 に答える
5

pathinfo() は、ドイツ語の 'ウムラウテ' などの特殊文字を含む引数を処理できない」 を参照してください。

于 2010-12-15T15:52:59.927 に答える
1

ansi 文字を処理するとき、関数 pathinfo は正しく動作します。

このメモに基づいて、入力を ansi 文字に変換 (エンコード) し、引き続き関数 pathinfo を使用してその全体を保持します。

最後に、出力値を元の形式に変換 (デコード) します。

そして、次のようにデモします。

function _pathinfo($path, $options = null)
{
    $path = urlencode($path);
    $parts = null === $options ? pathinfo($path) : pathinfo($path, $options);
    foreach ($parts as $field => $value) {
        $parts[$field] = urldecode($value);
    }
    return $parts;
}
// calling
_pathinfo('すtest.jpg');
_pathinfo('すtest.jpg', PATHINFO_EXTENSION);
于 2015-07-28T09:01:12.290 に答える
0

ドキュメントが示すように、

注意

pathinfo() はロケールに対応しているため、マルチバイト文字を含むパスを正しく解析するには、setlocale() 関数を使用して一致するロケールを設定する必要があります。

そしてマニュアルの

于 2019-08-10T03:34:28.903 に答える