Ошибка file_exists () и file_get_contents () для файла с именем output ‹ÕÍÕ ¥ .txt в PHP? - PullRequest
3 голосов
/ 09 июля 2011

file_exists() и file_get_contents() терпят неудачу в файле с именем output‹ÕÍÕ¥.txt (в качестве примера), хотя я знаю, что он существует?

Я предполагаю, что он как-то связан со специальнымсимволы в имени файла?.

Так было интересно, что такое обходной путь?

Оцените все ответы.

К вашему сведению:

Обратите внимание, если вы думаетепочему бы просто не изменить имя файла?- Я не могу, так как имя файла генерируется обобщенно, и изменить имя файла будет означать использование файловых функций PHP (которые, кажется, не допускают использование специальных символов в аргументах имени файла - если только я ничего не неправильно понял / неправильно понял)).

Я использую PHP 5.2 в Windows.

1 Ответ

5 голосов
/ 09 июля 2011

Убедитесь, что кодировка файловой системы совпадает с кодировкой строки, содержащей имя файла в вашем коде PHP.

В противном случае вы проверяете, существует ли неправильный файл.

Например, если ваша файловая система не поддерживает UTF-8, но имя файла закодировано в UTF-8.

Edit:

Итак, вы прокомментировали, что имя файла в UTF-8, и вы используете windows.

Именно об этом и был мой ответ. Как написано здесь :

Плохие новости для пользователей Windows: файловые системы Windows (FAT, FAT32, NTFS) не поддерживают UTF-8. Имена файлов кодируются в ISO-8859-1 или CP437 / CP850 / (или в соответствии с вашим языком) в зависимости от файловой системы и локализации. Поэтому вы, вероятно, столкнетесь с проблемами, пытаясь сопоставить имена файлов из базы данных и файловой системы, если будете следовать этому руководству. (Хотя я никогда не пробовал.)

Обходной путь Windows: современные версии Windows поддерживают UTF-8 на смонтированных общих ресурсах. Создайте общий доступ к своей медиа-папке и подключите ее как сетевой диск.

Поэтому создайте общий ресурс или закодируйте имя файла в кодировке, которая фактически работает с вашей файловой системой. Это не ошибка в PHP. Вы просто не проверяете правильное имя файла, вот и все.

Edit2:

Предполагая, что у вас есть NTFS, которая может принимать UTF-16 (что не совсем точно AFAIK, но вы можете попробовать), вы можете преобразовать имя файла UTF-8 в имя-имя UTF-16. :

$name = mb_convert_encoding($name, 'UTF-16', 'UTF-8');

А затем попробуйте, если file_exists работает. Имейте в виду, что он может быть технически неверным, и у вас может иметь дополнительную проблему с кодировкой, которая мешает вам правильно использовать даже эту перекодировку.

Связано: В какой кодировке хранятся имена файлов в NTFS?

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