Как открыть файл в PHP, в имени которого есть символы Юникода? - PullRequest
8 голосов
/ 10 июня 2009

Например, у меня есть такое имя файла - проба.xml, и я не могу открыть его из скрипта PHP.

Если я настрою скрипт php в utf-8, то весь текст в скрипте будет utf-8, поэтому, когда я передаю это в file_get_contents:

$fname = "проба.xml";
file_get_contents($fname);

Я получаю сообщение об ошибке, что файл не существует. Причина этого заключается в том, что в Windows (XP) все имена файлов с нелатинскими символами являются Unicode (UTF-16). ОК, поэтому я попробовал это:

$fname = "проба.xml";
$res = mb_convert_encoding($fname,'UTF-8','UTF-16');
file_get_contents($res);

Но ошибка сохраняется, так как file_get_contents не может принимать строки Unicode ...

Есть предложения?

Ответы [ 3 ]

11 голосов
/ 29 января 2015

ОБНОВЛЕНИЕ (13 июля 17 июля)

Хотя документы, по-видимому, не упоминают об этом, PHP 7.0 и выше, наконец, поддерживают имена файлов Unicode в Windows из коробки. API файловой системы PHP принимают и возвращают имена файлов в соответствии с default_charset, что по умолчанию равно UTF-8.

См. Исправление ошибки здесь: https://github.com/php/php-src/commit/3d3f11ede4cc7c83d64cc5edaae7c29ce9c6986f


ОБНОВЛЕНИЕ (29 января '15)

Если у вас есть доступ к каталогу расширений PHP, вы можете попробовать установить php-wfio.dll в https://github.com/kenjiuno/php-wfio, и обращаться к файлам по протоколу wfio://.

file_get_contents("wfio://你好.xml");

Оригинальный ответ

PHP в Windows использует устаревшие «API-интерфейсы ANSI» исключительно для локального доступа к файлам, что означает, что PHP использует System Locale вместо Unicode.

Чтобы получить доступ к файлам, имена файлов которых содержат Unicode, необходимо преобразовать имя файла в указанную кодировку для текущей локали системы. Если имя файла содержит символы, которые не могут быть представлены в указанной кодировке, вам не повезло (Обновление: решение см. В разделе выше) . scandir вернет бред для этих файлов и передаст строку обратно в fopen, и эквиваленты не получатся.

Чтобы найти правильную кодировку для использования, вы можете получить языковой стандарт системы, позвонив по номеру <?=setlocale(LC_TYPE,0)?> и найдя Идентификатор кодовой страницы (число после .) в статье MSDN https://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx.

Например, если функция возвращает Chinese (Traditional)_HKG.950, это означает, что кодовая страница 950 используется и имя файла должно быть преобразовано в кодировку big-5. В этом случае ваш код должен выглядеть следующим образом, если ваш файл сохранен в UTF-8 (желательно без спецификации):

$fname = iconv('UTF-8','big-5',"你好.xml");
file_get_contents($fname);

или следующим образом, если вы напрямую сохраняете файл как Big-5:

$fname = "你好.xml";
file_get_contents($fname);
0 голосов
/ 16 июня 2009

На данный момент это выводы:

  1. PHP 5 не может открыть имя файла с символами Unicode, если исходное имя файла не является Unicode.
  2. PHP 5 (по крайней мере, в Windows XP) не может обрабатывать исходный код PHP в Unicode.

Таким образом, вывод, что это невозможно сделать в PHP 5.

0 голосов
/ 11 июня 2009

Вы можете попробовать:

  • получение строки для имени файла из списка каталогов с использованием opendir и readdir
  • передача этой строки в file_get _contents, чтобы посмотреть, сработает ли она, или
  • попробуйте получить содержимое файла, используя fopen, fread и fclose

Надеюсь, это поможет!

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