Um nome de arquivo PHP (ou um diretório em seu caminho completo) possui caracteres UTF-8?

Gostaria de acessar um arquivo PHP cujo nome possui caracteres UTF-8.

O arquivo não tem uma lista de materiais na mesma. Ele apenas contém uma declaração de eco que exibe alguns caracteres unicode.

Acessar a página PHP a partir do navegador (FireFox 3.0.8, IE7) resulta em erro HTTP 500.

Existem duas inputs no log Apache (o arquivo é / க. Php; a letra க é composta e corresponde aos caracteres \ xe0 \ xae \ x95 no registro abaixo):

[Sáb 04-04 09:30:25 2009] [erro] [cliente 127.0.0.1] PHP Aviso: Desconhecido: falha ao abrir o stream: Nenhum arquivo ou diretório em Unknown na linha 0

[Sáb Apr 04 09:30:25 2009] [erro] [cliente 127.0.0.1] PHP Erro fatal: Desconhecido: Falha na abertura necessária ‘D: / va / ROOT / \ xe0 \ xae \ x95.php‘ (include_path = ‘ .; C: \ php5 \ pear ‘) em Desconhecido na linha 0

A mesma página funciona quando os nomes de arquivo e dir estão em inglês. Na mesma configuração, não há nenhum problema ao usar o SSI para essas páginas.

EDITAR

Informações removidas sobre a reescrita url, uma vez que não parece ser um fator.

Quando mod_rewrite é removido, o arquivo PHP ainda não funciona. Funciona se o arquivo for renomeado para um nome não-UTF. No entanto, o shtml funciona mesmo com caracteres UTF no arquivo e / ou no nome do caminho.

Eu encontrei o mesmo problema e fiz algumas pesquisas e conclui o seguinte. Isto é para o php5 no Windows; Provavelmente é verdade em outras plataformas, mas não verifiquei.

  1. TODAS as funções do sistema de arquivos php (dir, is_dir, is_file, file, filemtime, filesize, file_exists, etc.) apenas aceitam e retornam nomes de arquivos no ISO-8859-1, independentemente do conjunto default_charset definido no programa ou arquivos ini.

  2. Onde um nome de arquivo contém um caractere unicode dir-> read irá devolvê-lo como o caractere ISO-8859-1 correspondente, se houver um, caso contrário ele irá replace um ponto de interrogação.

  3. Quando se faz referência a um arquivo, por exemplo, em arquivo_servidor ou arquivo, se você passar num nome de arquivo UTF-8, o arquivo não será encontrado quando o nome contiver caracteres de dois bytes ou mais. No entanto, is_file (utf8_decode ($ filename)), etc., funcionará fornecendo o caractere UTF-8 representável no ISO-8859-1.

Em outras palavras, o PHP5 não é capaz de endereçar arquivos com caracteres de vários bytes em seus nomes.

Se um URL UTF-8 com caracteres multibyte for solicitado e isso corresponderá diretamente a um arquivo, o PHP não poderá abrir o arquivo porque ele não pode abordá-lo.

Se você simplesmente quer URLs bonitas em seu idioma, a sugestão de usar mod_rewrite parece ser boa.

Mas se você estiver armazenando e recuperando arquivos carregados e baixados pelos usuários, esse problema deve ser resolvido. Uma maneira é usar um nome de arquivo arbitrário (não UTF-8), como um número de incremento, no servidor e indexar os arquivos em um database ou arquivo XML ou algum desses. Outra maneira é armazenar os arquivos no próprio database como um BLOB. Outra maneira (o que é talvez mais fácil de ver o que está acontecendo e não está sujeito a problemas se seu índice é corrompido) é codificar os nomes dos arquivos você mesmo – uma boa técnica é urlencode (sic) todos os seus nomes de input ao armazenar no servidor disque e identifique-os antes de configurar o nome do arquivo no header mime para o download. Todos os caracteres vagamente incomuns (exceto%) são então codificados como% nn e, portanto, todos os problemas com espaços em nomes de arquivos, suporte de plataforma cruzada e correspondência de padrões são em grande parte evitados.

  • Eu sei, de fato, o PHP em si pode trabalhar com URLs Unicode, porque tentei usar nomes de páginas Unicode em MediaWiki (baseado em PHP, também é WikiPedia) e funciona. Por exemplo, URLs como /index.php/Page_name©. Então o PHP pode lidar com isso. Mas pode ser um problema com o Apache encontrar um arquivo onde o arquivo fonte possui um nome UTF-8.

  • A configuração PHP.ini para codificação de caracteres não deve afetar isso; é tarefa do servidor web encontrar um recurso específico e, em seguida, chamar PHP uma vez que esteja determinado a ser um arquivo PHP. Significará que o servidor web e o próprio sistema de arquivos subjacentes devem ser capazes de lidar com nomes de arquivos UTF-8.

  • Isso funciona sem a regra mod_rewrite? Ou seja, se você desabilitar o mecanismo de rewrite com RewriteEngine e então solicitar va.in/utf_dir/utf_file.php? Se assim for, pode ser um problema de configuração mod_rewrite ou um problema com a regra.

  • Unicode em URLs pode não ser devidamente suportado em alguns navegadores quando você apenas digita um endereço, como navegadores mais antigos. Os navegadores mais antigos podem ignorar a etapa de codificação UTF-8. Isso não deve impedir que ele funcione se você estiver seguindo um link em uma página, onde essa página é codificada em UTF-8, no entanto.

Só porque o conjunto de caracteres é UTF-8 não significa que ele suporte todos os caracteres mais altos do Unicode.

Suporte Unicode é uma das principais adições que vem no PHP 6 e o ​​PHP 5 é nutorioso por falta de suporte Unicode.

Se o seu script PHP está gerando o link, ele pode ser um problema diferente do que se o apache estiver interpretando o URL diretamente e redirecionando-o.

Não. Nomes de arquivos PHP devem estar em ASCII, não importa como você configura seu servidor. O PHP5 não pode lidar, então esperamos pelo PHP 6. Dentro de um script PHP, você pode usar utf-8 filename / url usando utf8_decode. Você pode usar um .htaccess e SQL para contornar muitos problemas, mas não há como executar um nome de arquivo unicode.

A resposta de David Earl está correta.

Use “wfio: //” para escrever cópia, etc.

https://github.com/kenjiuno/php-wfio

Para pasta:

.htaccess:

php_value auto_prepend_file C:/fix.php

fix.php:

 $file = $_SERVER['SCRIPT_FILENAME']; if (!is_readable($file)) { $file="wfio://".$file; include $file; exit; } 

Mas melhor para php usar Linux OS