Pregunta

En OS-X (PHP5.2.11) Tengo un archivo: siësta.doc (y miles de otros con nombres de archivo Unicode) y quiero convertir los nombres de los archivos a un formato comprimido consumible (a-zA-Z0-9 .). Si codificar el nombre de archivo por encima de lo que puedo hacer la conversión derecha:

<?php
  $file = 'siësta.doc';
  echo preg_replace("/[^a-zA-Z0-9.]/u", '_', $file);
  // Output: si_sta.doc
?>

Pero si leo los nombres de archivo con scandir, Tengo extrañas conversiones:

<?php
  $files = scandir(DIRNAME);
  foreach ($files as $file) {
    echo preg_replace("/[^a-zA-Z0-9.]/u", '_', $file);
    // Output for the file above: sie_sta.doc
  }
?>

He intentado detectar la codificación, establezca la codificación, convertir con funciones iconv. Probé las funciones mb_nogueira @ yahoo.com también. Pero era peor. ¿Qué hice mal?

Gracias de antemano

¿Fue útil?

Solución

Interesante. Después de un poco recherché i he encontrado que las tiendas OSX nombres de archivo como "Unicode descompuesto" (ver http://developer.apple.com/mac/library/qa/qa2001/qa1173.html ). Es decir, "E" se representa como "e" + símbolo diéresis (0xcc88).

Otros consejos

Si probamos utf8_encode? (Funciona en Windows, al menos)

<?php
  $files = scandir(DIRNAME);
  foreach ($files as $file) {
    echo preg_replace("/[^a-zA-Z0-9.]/u", '_', utf8_encode($file));
    // Output for the file above: sie_sta.doc
  }
?>

El problema es la comunicación entre las ventanas y php. Está no es posible obtener los nombres de archivo Unicode, ya que dependen no Unicode idioma de la aplicación de Windows.

La mejor solución es ejecutar un comando dir y obtener información para ser procesada, pero hay que hacerlo a través de una cmd, y obtener los nombres cortos ventanas:

chcp 65001
dir /x c:\test\ > myinfo.txt

Devuelve:

 El volumen de la unidad C es Windows8_OS
 El número de serie del volumen es: 14A3-025F

 Directorio de C:\test

22/12/2015  22:11    <DIR>                       .
22/12/2015  22:11    <DIR>                       ..
22/12/2015  22:12                 0              a.txt
22/12/2015  22:10    <DIR>                       English
22/12/2015  22:10    <DIR>          ESPAOL~1     Español
22/12/2015  22:11    <DIR>          8311~1       ру́сский язы́к
22/12/2015  22:10    <DIR>          _0B41~1      عربي ,عربى
22/12/2015  22:10    <DIR>          8F4C~1       北方話
               1 archivos              0 bytes
               7 dirs  839.672.786.944 bytes libres

A continuación, se puede leer myinfo.txt para conseguir la conexión entre el nombre original y ventanas nombre corto.

Algunas funciones PHP trabaja bien con los nombres cortos y se puede construir y matriz como si necesita mostrar que:

$array['short_name']= $original_name;

Por ejemplo: is_dir, is_file funciona bien . Sin embargo, scandir o is_readable falla con nombres cortos también . La solución de utilizar estas funciones es volver a ejecutar un comando dir de forma recursiva.

Para obtener información desde un archivo txt, puede utilizar una expresión regular o substr, desechando los primeros cinco líneas y los dos últimos. Por ejemplo:

for($k=6;$k<(count($array)-2);$k++) ...
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top