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


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

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

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

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

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

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

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

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

Удалена информация о перезаписи URL-адресов, поскольку это, похоже, не является фактором.

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

Author: Raleigh, 2009-04-02

5 answers

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

  1. ВСЕ функции файловой системы php (dir, is_dir, is_file, файл, время файла, размер файла, файл_существует и т.д.) принимают и возвращают только имена файлов в 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-файле или в чем-то подобном. Другой способ - хранить файлы в самой базе данных в виде большого двоичного объекта. Другой способ (который, возможно, проще увидеть, что происходит, и не подвержен проблемам, если ваш индекс поврежден) - это самостоятельно кодировать имена файлов - хороший метод заключается в том, чтобы url-кодировать (sic) все ваши входящие имена файлов при хранении на диске сервера и URL-кодировать их перед настройкой имя файла в заголовке mime для загрузки. Все даже смутно необычные символы (кроме %) затем кодируются как %nn, и поэтому в значительной степени избегаются любые проблемы с пробелами в именах файлов, кросс-платформенной поддержкой и сопоставлением шаблонов.

 15
Author: David Earl, 2009-12-11 12:01:04
  • Я точно знаю, что сам PHP может работать с URL-адресами в Юникоде, потому что я пробовал использовать имена страниц в Юникоде в MediaWiki (на основе PHP, также работает ВикипЕдия), и это работает. Например, URL-адреса, такие как /index.php/Имя_страницы©. Так что 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.

 6
Author: thomasrutter, 2009-04-02 05:55:53

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

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

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

 2
Author: Fire Crow, 2009-04-02 02:31:23

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

Ответ Дэвида Эрла верен.

 1
Author: Tristanisginger, 2013-06-05 13:51:59

Используйте "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

 0
Author: Vitalicus, 2017-03-02 18:37:00