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

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

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

Доступ к странице 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 в имени файла и/или пути.

Ответ 1

Я столкнулся с той же проблемой и сделал некоторые исследования и заключил следующее. Это для 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, и поэтому любые проблемы с пробелами в именах файлов, поддержкой кросс-платформы и сопоставлением шаблонов во многом исключаются.

Ответ 2

  • Я знаю, что сам 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.

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

Используйте "wfio://" для копирования, e.t.c.

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 OS