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)
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;
}
}
这个问题的临时解决方法似乎是确保重音字符前面有一个"正常"字符,如下所示:
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()似乎确实有效,因此那里不需要解决方法.
| 归档时间: |
|
| 查看次数: |
9677 次 |
| 最近记录: |