ruta pathinfo_extension obtener name extension completa basename archivo _files php utf-8 pathinfo

pathinfo_extension - php get file name



Hacer que PHP pathinfo() devuelva el nombre de archivo correcto si el nombre de archivo es UTF-8 (6)

Consulte " pathinfo () no puede manejar argumentos con caracteres especiales como el alemán ''Umlaute'' ".

Cuando se utiliza la función pathinfo() PHP en un nombre de archivo conocido como UTF-8, no devuelve el valor correcto, a menos que haya caracteres "normales" delante del carácter especial.

Ejemplos:
pathinfo(''aä.pdf'') devuelve:

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

que es fino y elegante, pero pathinfo(''äa.pdf'') devuelve:

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

Que no es exactamente lo que esperaba. Peor aún, pathinfo(''ä.pdf'') devuelve:

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

¿Por qué hace esto? Esto va para todos los personajes acentuados que he probado.


Cuando se procesan caracteres ansi, la función pathinfo lo hace correctamente.

Base esta nota, convertiremos (codificar) la entrada a caracteres de caracteres y luego usaremos la función pathinfo para mantener todo esto.

Finalmente, convertiremos (decodificando) los valores de salida al formato original.

Y la demostración como bramando.

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


He usado estas funciones en PHP 5.3.3 - 5.3.18 para manejar el problema de UTF-8 en basename () y pathinfo ().

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


Una solución temporal para este problema parece ser asegurarse de que haya un carácter "normal" delante de los caracteres acentuados, como por ejemplo:

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

Tenga en cuenta que reemplazamos todas las apariciones de ''/'' con ''/ a'', pero esto está bien, ya que volvemos a partir del desplazamiento 1 del resultado. Curiosamente, la parte dirname de pathinfo() parece funcionar, por lo que no se necesita una solución alternativa allí.


antes de usar pathinfo

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


private function _pathinfo($path, $options = null) { $result = pathinfo('' '' . $path, $options); return substr($result, 1); }