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 PHP e arquivos que possuem caracteres de vários bytes 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
)
Incorreto Saída 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 que foi postado on-line há mais de dois anos):
Dos comentários sobre este artigo: link
The output from your PHP installation on Windows is easy to explain :
you installed the wrong version of PHP, and used a version not
compiled to use the Unicode version of the Win32 API. For this reason,
the filesystem calls used by PHP will use the legacy "ANSI" API and so
the C/C++ libraries linked with this version of PHP will first try to
convert yout UTF-8-encoded PHP string into the local "ANSI" codepage
selected in the running environment (see the CHCP command before
starting PHP from a command line window)
Your version of Windows is MOST PROBABLY NOT responsible of this weird
thing. Actually, this is YOUR version of PHP which is not compiled
correctly, and that uses the legacy ANSI version of the Win32 API (for
compatibility with the legacy 16-bit versions of Windows 95/98 whose
filesystem support in the kernel actually had no direct support for
Unicode, but used an internal conversion layer to convert Unicode to
the local ANSI codepage before using the actual ANSI version of the
API).
Recompile PHP using the compiler option to use the UNICODE version of
the Win32 API (which should be the default today, and anyway always
the default for PHP installed on a server that will NEVER be Windows
95 or Windows 98...)
Não posso confirmar se isso é problema meu ou não. Eu usei phpinfo()
e não achei nada interessante, mas não sabia ao certo o que procurar. Eu tenho usado o XAMPP para facilitar as instalações, então não sei exatamente como ele foi instalado.
Estou usando o Windows 7, de 64 bits - por isso, perdoe minha ignorância, mas não tenho certeza se "Win32" é relevante aqui. Como posso verificar se a minha versão atual do PHP foi compilada com a configuração mencionada acima?
-
PHP Version: 5.3.8
-
System: Windows NT WES-PC 6.1 build 7601 (Windows 7 Home Premium Edition Service Pack 1) i586
-
Build Date: Aug 23 2011 11:47:20
-
Compiler: MSVC9 (Visual C++ 2008)
-
Architecture: x86
-
Configure Command:
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 alguma informação útil, aqui está uma captura de tela da minha phpinfo()
(seção mbstring):
ComopossodescobrirseaminhainstalaçãodoPHPfoi"compilada com a versão UNICODE da API do Win32"? (e isso realmente faz algum sentido?)