UTF-8, PHP, Win7 - есть ли решение для сохранения имен файлов UTF-8 в Win 7 с помощью php?

Обновление: просто, чтобы не заставлять вас читать все: PHP, начиная с 7.1.0alpha2, поддерживает имена файлов UTF-8 в Windows. (Спасибо Анатолию-Бельскому!)

Следуя цепочкам ссылок в stackoverflow, я нашел часть ответа:
https://stackoverflow.com/a/10138133/3716796 Умберто Сальси
(и по тому же вопросу: https://stackoverflow.com/a/2950046/3716796 by Artefacto)
Вкратце: «PHP взаимодействует [s] с базовой файловой системой как « программа, не поддерживающая Unicode »», и из-за этого все имена файлов передаются PHP Windows и наоборот автоматически переводятся / перекодируются Windows. Это вызывает ошибки. И вы, похоже, не можете остановить автоматическое перекодирование.
https://stackoverflow.com/a/2888039/3716796 от Artefacto:
«PHP не использует широкие вызовы WIN32 API, поэтому вы ограничены кодовой страницей.»)
И на https://bugs.php.net/bug.php?id=47096 есть отчет об ошибке для PHP.

Хотя там Николас предполагает, что COM-объект может работать!
$ fs = new COM ('Scripting.FileSystemObject', null, CP_UTF8);

Может быть, я когда-нибудь попробую это сделать.

Осталась часть моего вопроса слева: есть ли PHP6, или он был отозван, или есть что-то новое по этой теме на PHP? < / em>

// полный вопрос
Большинству вопросов по этой теме от 1 до 5 лет. Может ли php теперь сохранить файл с помощью file_put_contents ($ dir. '/'. $ _POST ['fileName'], $ _POST ['content']);

когда $ _POST ['fileName'] закодирован в UTF-8, например "Крым.xml"? В настоящее время он сохранен как ÐšÑ € Ñ ‹Ð¼.xml

Я проверил переменную fileName, поэтому могу быть уверен, что это UTF-8: echo mb_detect_encoding ($ _ POST ['fileName']);

  1. Есть ли что-нибудь новое в PHP, что могло бы это сделать?
  2. В некоторых местах я читал, что PHP 6 сможет это сделать, но PHP 6, если я правильно помню, был отозван. ?
  3. В проводнике Windows я могу изменить имя файла на «Крым.xml». Насколько я понял старые вопросы и ответы, должно быть возможно использовать file_put_contents, если fileName-var просто закодирован в кодировку, используемую Windows 7 и этим диском NTFS. Есть даже 3 старых вопроса с ответами, которые утверждают, что они были успешными:
    Обработка файлов PHP с использованием специальных символов UTF-8
    Преобразование UTF-16LE в UTF-8 в php
    и PHP: как создавать имена файлов в формате Unicode

    В целом и наиболее одобренные ответы говорят, что это невозможно. Я уже сам проверил все предложенные ответы, и ни один из них не работает.
  4. Как определенно и с абсолютной точностью узнать, в какой кодировке моя Win 7 и Explorer сохраняет имя файла на моем NTFS-диске и с настройкой немецкого языка? Как сказано: я могу создать файл "Крым.xml" в проводнике.

Мой вывод:
1. Либо file_put_contents не работает правильно при передаче fileName (что я пробовал с преобразованиями в UTF-16, UTF-16LE, ISO-8859-1 и Windows-1252) в Windows,
2. или file_put_contents просто не реализует способ вызова собственной файловой функции Windows соответствующим образом (так что эта вторая возможность будет означать, что это не ошибка, а просто не реализована.) (Например, в notepad ++ нет проблем с созданием, записью и переименованием файла файл с названием Крым.xml.)

Только один пример сообщений об ошибках, которые я получил, в данном случае, когда я использовал mb_convert_encoding ($ theFilename, 'Windows-1252', 'UTF-8')

«Предупреждение: file_put_contents (dirToSaveIn / ????. Xml): не удалось открыть поток: нет ошибки в C: \ aa xampp \ htdocs \ myinterface.lo \ myinterface \ phpWriteLocalSearchResponseXML.php в строке 26». сообщения об ошибках, начиная от «недопустимые символы» и заканчивая тем, что строка вообще не распознается.

Привет Джон


person John2015    schedule 27.06.2014    source источник
comment
До того дня, когда файловая система Windows сможет волшебным образом работать с любой кодировкой, известной человечеству, НЕ ДЕЛАЙТЕ ЭТОГО   -  person Mark Baker    schedule 27.06.2014
comment
И это не имеет ничего общего с PHP, а все, что связано с файловыми системами операционной системы: попробуйте в Perl, Python, Ruby, Java, Go, Haskell и т. Д.   -  person Mark Baker    schedule 27.06.2014
comment
@MarkBaker: Это (очевидно) не Windows, а PHP.exe, работающий как программа, не поддерживающая Unicode. Другие .exe-программы могут связываться с Windows соответственно. (Вот почему уже в моем первоначальном вопросе я указал, что Notepad ++ может создавать, записывать и переименовывать такие файлы.)   -  person John2015    schedule 27.06.2014
comment
Это то, что вы не можете гарантировать ни на одной платформе, поэтому PHP (который является мультиплатформенным) не смотрит, какие кодировки поддерживает файловая система, как и многие другие языки программирования ... обычно только собственные приложения могут это делать. это .... вот почему не рекомендуется использовать символы, отличные от ASCII, в любом имени файла   -  person Mark Baker    schedule 27.06.2014


Ответы (1)


PHP, начиная с версии 7.1.0alpha2, поддерживает имена файлов UTF-8 в Windows.

Спасибо.

person Anatol Belski    schedule 03.07.2016
comment
На всякий случай, если кому-то это понадобится, вот PHP-скрипт, который сканирует каталоги и массово преобразует имена файлов в другую кодировку: github.com/chang-zhao/encoding Я использовал его для преобразования тысяч файлов TXT из тарабарщины utf8 старого PHP в новые читаемые. - person chang zhao; 16.11.2018