Pergunta

No OS-X (Php5.2.11), tenho um arquivo: Siësta.doc (e mil outros com nomes de arquivos Unicode) e quero converter os nomes de arquivos em um formato consumível na Web (A-ZA-Z0-9.). Se eu codificar o nome do arquivo acima, posso fazer a conversão certa:

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

Mas se eu ler os nomes de arquivos com Scandir, tenho conversões estranhas:

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

Tentei detectar a codificação, definir a codificação, convertê -la com as funções ICONV. Eu tentei as funções MB_ também. Mas foi apenas pior. O que eu fiz errado?

desde já, obrigado

Foi útil?

Solução

Interessante. Depois de um pouco de recherché, descobri que o OSX armazena nomes de arquivos como "unicode decomposto" (veja http://developer.apple.com/mac/library/qa/qa2001/qa1173.html). Ou seja, "ë" é representado como "E" + Símbolo da Diaresesis (0xcc88).

Outras dicas

Você tentou UTF8_ENCODE? (Funciona pelo menos no Windows)

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

O problema é a comunicação entre o Windows e o PHP. Não é possível obter nomes de arquivos Unicode, porque eles dependem do idioma do aplicativo do Windows não unicode.

A melhor solução é executar um comando DIR e obter informações a serem processadas, mas você deve fazê -lo através de um CMD e obter os nomes curtos do Windows:

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

Ele retorna:

 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

Em seguida, você pode ler myinfo.txt para obter a conexão entre o nome original e o nome curto do Windows.

Algumas funções PHP funcionam bem com nomes curtos e você pode construir e matar como se precisasse exibi -lo:

$array['short_name']= $original_name;

Por exemplo: is_dir, is_file funciona bem. No entanto, scandir ou is_readable falha com nomes curtos também. A solução para usar essas funções é executar novamente um comando DIR de forma recursivamente.

Para obter informações do arquivo txt, você pode usar uma expressão ou substrato regular, descartando as cinco primeiras linhas e as duas últimas. Por exemplo:

for($k=6;$k<(count($array)-2);$k++) ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top