none
Прошу помочь с проблема кодировки имён файлов на виртуальном хостинге в среде Windows под управлением Apache RRS feed

  • Вопрос

  • Возникают проблемы при загрузке файлов и записью на диск, когда они имеют русские имена?

    Повреждается только имя файла, например:

     «объект "файл.jpg" сохранятся с именем файл.jpg»

    Содержимое остаётся целым в независимости от кодировки искомых.

    СУТЬ ПРОБЛЕМЫ:

    Есть сайт на хостинге (несколько различных сайтов с CMS Joomla, MODx и т.п.), которые периодически наполняются контентом от веб-пользователей. Хостинг корректно поддерживает загрузку и сохр. файлов с русскими именами через файл-менеджер. Время от времени на сайтах запускаются доп. модули и плагины, - для этого они (в виде содержимого сервера, через FTP) копируются на ноутбук с настроенным виртуальным хостингом для тестирования. Если раннее пользователь загружал, что-то с русским именем, то это приводит к фатальным ошибкам в работе скриптов на виртуальном хостинге.

    Для понимания проблемы проводился тест скриптов PHP с использованием специальных функции на вирт.хостинге со следующими результатами:

    • Проблема возникает именно во время записи на диск, в файловую систему Windows (Виндовс 7).
    • Во время исполнения скрипта .php имя файла можно корректно воспроизводить из указателя ("data handler")
    • После команды перемещения на диск виртуального хостинга. Файл создаётся с бракованным именем.
    • Использую инструкцию iconv() в скрипте перекодирования строки с именем файла из UTF-8 в windows-1251 можно сохранять файлы с именем оригинала.

    Решению проблемы помогло бы понимание того, какие параметры среды Windows необходимы для корректного взаимодействия программы сервера (или интерпретатора PHP) с файловой системой ОС...

    Странным кажется тот факт, что в самом Windows можно писать любые имена файлов, например:

     «Описание препарата Кагоцел®.doc», «Отчёты • Справки.docx», «Папка с кодами…» и всё работает!

    Проблема с кодировкой напоминает работу некоторых .bat скриптов. Если «батник» имеет отличную от DOS-866 кодировку, то команда вроде:

     echo файл.png

     pause

    # При запуске в проводнике консоль выведет что-то вроде – файл.jpg

    Встречал к примеру про процессов через wmic в спец.режиме или может существует какой-то специальный режим запуска консольных или DOS-подобных программ?


    • Изменено EskanderDon 1 июля 2014 г. 9:39

Ответы

  • Windows имеет два набора API: старый для неюникодный программ с 8 битными строками в определенной ANSI кодировке и "новый" (~20 лет наверное) для юникодных программ с 16 битными строками в UTF-16. 

    В ОС все хранится в Юникоде поэтому в любой юникодной программе (коих сейчас большинство) можно совершенно любые имена файлов, причем с символами из разных кодовых страниц одновременно.

    Так что вопрос в том какие API использует PHP. Если он использует свои 8 битные строчки через старые 8 битные API то потребуется обязательная перекодировка из той кодировки в которой пришла строика в ту кодировки (страницу ANSI) которая установлена в ОС. 

    Надо выязнить что именно использует ПХП и какие кодировки используются.

    Так же посмотрите тут:

    http://www.joelonsoftware.com/articles/Unicode.html


    This posting is provided "AS IS" with no warranties, and confers no rights.

    1 июля 2014 г. 14:52
    Модератор