Может ли имя файла PHP (или каталог полного пути) содержать символы UTF-8?

Я хотел бы получить доступ к файлу PHP, чье имя содержит символы UTF-8.

В файле нет спецификации. Он просто содержит инструкцию echo, которая отображает несколько символов Unicode.

Доступ к странице PHP из браузера (FireFox 3.0.8, IE7) приводит к ошибке HTTP 500.

В журнале Apache есть две записи (файл is / க. Php; буква க является составной и соответствует символам \ xe0 \ xae \ x95 в журнале ниже):

[Сб апр 04 09:30:25 2009] [ошибка] [клиент 127.0.0.1] PHP Предупреждение: Неизвестно: не удалось открыть поток: нет такого файла или каталога в Unknown в строке 0

[Сб апр 04 09:30:25 2009] [ошибка] [клиент 127.0.0.1] PHP Неустранимая ошибка: Неизвестно: Не удалось открыть окно «D: / va / ROOT / \ xe0 \ xae \ x95.php» (include_path = ' .; C: \ php5 \ pear ') в Unknown в строке 0

Эта же страница работает, когда имена файлов и dir находятся на английском языке. В той же настройке нет проблем с использованием SSI для этих страниц.

РЕДАКТИРОВАТЬ

Убрана информация о перезаписи URL, так как она не является фактором.

Когда mod_rewrite удаляется, файл PHP по-прежнему не работает. Работает, если файл переименован в имя, отличное от UTF. Однако shtml работает даже с символами UTF в имени файла и / или пути.

Я столкнулся с одной и той же проблемой и сделал некоторые исследования и заключил следующее. Это для php5 в Windows; это, вероятно, верно на других платформах, но я не проверял.

  1. Все функции файловой системы php (dir, is_dir, is_file, file, filemtime, filesize, file_exists и т. Д.) Принимают и возвращают имена файлов в ISO-8859-1, независимо от набора по умолчанию, установленного в программе или ini-файлах.

  2. Если имя файла содержит символ юникода, dir-> read вернет его как соответствующий символ ISO-8859-1, если он есть, иначе он заменит знак вопроса.

  3. При обращении к файлу, например, в is_file или файле, если вы передаете имя файла UTF-8, файл не будет найден, если имя содержит любые два байта или более символов. Однако is_file (utf8_decode ($ filename)) и т. Д. Будет работать, если символ UTF-8 будет представлен в ISO-8859-1.

Другими словами, PHP5 не способен адресовать файлы с многобайтовыми символами в своих именах вообще.

Если URL-адрес UTF-8 с многобайтными символами запрашивается, и это напрямую соответствует файлу, PHP не сможет открыть файл, потому что он не может его решить.

Если вам просто нужны красивые URL-адреса на вашем языке, предложение об использовании mod_rewrite кажется хорошим.

Но если вы храните и загружаете файлы, загруженные и загруженные пользователями, эта проблема должна быть решена. Один из способов – использовать на сервере произвольное (не UTF-8) имя файла, например, увеличивающееся число, и индексировать файлы в базе данных или XML-файле или некоторые из них. Другой способ – хранить файлы в самой базе данных как BLOB. Другой способ (который, возможно, легче увидеть, что происходит, и не подвержен проблемам, если ваш индекс поврежден) заключается в том, чтобы кодировать имена файлов самостоятельно – хорошая методика заключается в том, чтобы urlencode (sic) все ваши входящие имена файлов при хранении на сервере disk и urldecode перед установкой имени файла в заголовке mime для загрузки. Все даже неопределенно необычные символы (кроме%) затем кодируются как% nn, и поэтому любые проблемы с пробелами в именах файлов, поддержкой кросс-платформы и сопоставлением шаблонов во многом исключаются.

  • Я знаю, что сам PHP сам может работать с URL-адресами Unicode, потому что я попытался использовать имена страниц Unicode в MediaWiki (на основе PHP, также работает WikiPedia), и он действительно работает. Например, URL-адреса, такие как /index.php/Page_name©. Поэтому PHP может справиться с этим. Но может возникнуть проблема с обнаружением Apache файла, в котором исходный файл имеет имя UTF-8.

  • Параметр PHP.ini для кодировки символов не должен влиять на это; это задача веб-сервера найти определенный ресурс, а затем вызвать PHP, как только он будет определен как файл PHP. Это будет означать, что веб-сервер и основная файловая система должны иметь дело с именами файлов UTF-8.

  • Работает ли он без правила mod_rewrite? То есть, если вы отключите механизм перезаписи с RewriteEngine, а затем запросите va.in/utf_dir/utf_file.php? Если это так, то это может быть проблема конфигурации mod_rewrite или проблема с правилом.

  • Юникод в URL-адресах может некорректно поддерживаться в некоторых браузерах, когда вы просто вводите адрес, например старые браузеры. Старые браузеры могут пропустить шаг кодирования UTF-8. Это не должно мешать ему работать, если вы следуете ссылке на странице, где эта страница кодируется UTF-8.

Просто потому, что набор символов UTF-8 не означает, что он поддерживает все более высокие символы Unicode.

Поддержка Unicode является одним из основных дополнений, возникающих в PHP 6, а PHP 5 является нудным из-за отсутствия поддержки юникода.

Если ваш PHP-скрипт создает ссылку, это может быть другой проблемой, чем если apache интерпретирует URL напрямую и перенаправляет его.

Нет. Имена файлов PHP должны быть в ASCII, неважно, как вы настроили свой сервер. PHP5 не справляется, поэтому мы ждем PHP 6. В PHP-скрипте вы можете обрабатывать utf-8 filename / url с помощью utf8_decode. Вы можете использовать .htaccess и SQL, чтобы обойти множество проблем, но невозможно запустить имя файла в формате unicode.

Ответ Дэвида Эрла правильный.

Используйте «wfio: //» для копирования и т. Д.

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

Для папки:

.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; } 

Но лучше для PHP использовать ОС Linux