Isso está relacionado a esta postagem do Stack Overflow:
glob () não consegue encontrar nomes de arquivos com caracteres multibyte no Windows?
Estou tendo problemas com o PHP e arquivos com caracteres multibyte no Windows. Aqui está o meu caso de teste:
print_r(scandir('./uploads/'));
print_r(glob('./uploads/*'));
Saída correta no servidor UNIX remoto:
Array
(
[0] => .
[1] => ..
[2] => filename-äöü.jpg
[3] => filename.jpg
[4] => test이test.jpg
[5] => имя файла.jpg
[6] => פילענאַמע.jpg
[7] => 文件名.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
[2] => ./uploads/test이test.jpg
[3] => ./uploads/имя файла.jpg
[4] => ./uploads/פילענאַמע.jpg
[5] => ./uploads/文件名.jpg
)
Saída incorreta localmente no Windows:
Array
(
[0] => .
[1] => ..
[2] => ??? ?????.jpg
[3] => ???.jpg
[4] => ?????????.jpg
[5] => filename-äöü.jpg
[6] => filename.jpg
[7] => test?test.jpg
)
Array
(
[0] => ./uploads/filename-äöü.jpg
[1] => ./uploads/filename.jpg
)
Aqui está um trecho relevante da resposta que escolhi aceitar (que na verdade é uma citação de um artigo publicado on-line há mais de 2 anos):
Dos comentários neste artigo: http://www.rooftopsolutions.nl/blog/filesystem-encoding-and-php
A saída da instalação do PHP no Windows é fácil de explicar: você instalou a versão errada do PHP e usou uma versão não compilada para usar a versão Unicode da API do Win32. Por esse motivo, as chamadas do sistema de arquivos usadas pelo PHP usarão a API "ANSI" herdada e, portanto, as bibliotecas C / C ++ vinculadas a esta versão do PHP tentarão primeiro converter sua string PHP codificada em UTF-8 na "ANSI" local. página de código selecionada no ambiente em execução (consulte o comando CHCP antes de iniciar o PHP a partir de uma janela da linha de comandos)
A sua versão do Windows NÃO É MAIS PROVÁVEL responsável por essa coisa estranha. Na verdade, esta é a sua versão do PHP que não foi compilada corretamente e que usa a versão ANSI herdada da API do Win32 (para compatibilidade com as versões herdadas de 16 bits do Windows 95/98 cujo suporte ao sistema de arquivos no kernel na verdade não tinha nenhuma conexão direta). suporte para Unicode, mas usou uma camada de conversão interna para converter Unicode para a página de código ANSI local antes de usar a versão ANSI real da API).
Recompile o PHP usando a opção de compilador para usar a versão UNICODE da API do Win32 (que deve ser o padrão hoje e sempre o padrão do PHP instalado em um servidor que NUNCA será o Windows 95 ou Windows 98 ...)
Não posso confirmar se esse é o meu problema ou não. Usei phpinfo()
e não achei nada interessante, mas não sabia ao certo o que procurar. Eu tenho usado o XAMPP para instalações fáceis, por isso não tenho certeza exatamente como ele foi instalado.
Estou usando o Windows 7, 64 bits - então, perdoe minha ignorância, mas nem tenho certeza se o "Win32" é relevante aqui. Como posso verificar se minha versão atual do PHP foi compilada com a configuração mencionada acima?
- Versão do PHP : 5.3.8
- Sistema : Windows NT WES-PC 6.1 build 7601 (Windows 7 Home Premium Edition Service Pack 1) i586
- Data da construção : 23 de agosto de 2011 11:47:20
- Compilador : MSVC9 (Visual C ++ 2008)
- Arquitetura : x86
- Comando Configure :
cscript /nologo configure.js "--enable-snapshot-build" "--disable-isapi" "--enable-debug-pack" "--disable-isapi" "--without-mssql" "--without-pdo-mssql" "--without-pi3web" "--with-pdo-oci=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" "--with-oci8-11g=D:\php-sdk\oracle\instantclient11\sdk,shared" "--enable-object-out-dir=../obj/" "--enable-com-dotnet" "--with-mcrypt=static" "--disable-static-analyze"
Caso seja relevante ou revele qualquer informação útil, aqui está uma captura de tela do meu phpinfo()
(seção mbstring):
Como posso descobrir se minha instalação do PHP foi "compilada com a versão UNICODE da API do Win32"? (e isso realmente faz algum sentido?)