Я хотел бы получить доступ к файлу 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; это, вероятно, верно на других платформах, но я не проверял.
Все функции файловой системы php (dir, is_dir, is_file, file, filemtime, filesize, file_exists и т. Д.) Принимают и возвращают имена файлов в ISO-8859-1, независимо от набора по умолчанию, установленного в программе или ini-файлах.
Если имя файла содержит символ юникода, dir-> read вернет его как соответствующий символ ISO-8859-1, если он есть, иначе он заменит знак вопроса.
При обращении к файлу, например, в 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