ОБНОВЛЕНИЕ (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);