Проблемы с кодировкой создания папок php

У меня возникают проблемы с созданием файлов и папок с использованием Папки и библиотеки файлов из cakephp 3 (хотя это php mkdir в задней части этого).

Версия PHP 7.0.28

Шаги:

  1. Пользователь загружает файл (греческими символами)
  2. Система выполняет некоторую нерелевантную проверку и т. д.
  3. Система создает путь для сохранения файла в настраиваемой папке и сохраняет местоположение в таблице базы данных, как это: documents. DS . $user->username . DS . $file->protocol . $file->file_type . DS . $file->name Пример пути будет выглядеть так

/documents/user/Κ.300/Κ.310_6_4092.pdf

  1. В моей среде ubuntu он работает нормально, однако на Windows Server 2012 R2 части греческих символов выглядят так, как будто у них есть проблемы с кодировкой, например (извинения за плохое качество) Проблемы с кодировкой создания папок php

Я пробовал много вещей, и вот что я знаю на данный момент:

  • Ubuntu 16.04 использует кодировку UTF-8 так же, как php, поэтому папка отлично выглядит в моей среде разработки.
  • Windows использует UTF-16 (я полагаю, я не уверен на 100%), в который я должен его преобразовать, но когда я пытаюсь преобразовать путь в utf-16, я получаю следующую ошибку iconv или греческие символы выглядят как вопросительные знаки и php не может создать каталог:

illegal input sequence at position

Вот это базовый код:

public function setPath(array $data)
{
    Configure::load('file_directories', 'default');
    $path = $this->createPathFromData($data);
    $folder = new Folder('/');
    $folder->create($path);
    $this->directory = new Folder($path);
    if (!$this->validateDirectory()) {
        throw new Exception('Something went wrong when creating directories');
    }
}

Вот некоторые результаты отладки:

debug(mb_detect_encoding($path)); 

UTF-8

debug($path);
debug(iconv('UTF-8', 'UTF-16', $path));

'/inbox/documents/someUser/εξερχομενο/Κ.900'

'��/inbox/documents/someUser/����������/�.900'

debug(iconv('UTF-8', 'GREEK', $path));

'inbox/documents/someUser/���������/�.900'

debug(iconv('UTF-8', 'Windows-1252', $path));

[https://secure.php.net/function.iconv'>function.iconv]: Detected an illegal character in input string

Когда я ввожу любой из преобразованных путей кодирования в $folder->create($path), я все равно получаю поддельные пути, если они вообще есть.

Как я могу создать правильные файлы и пути к файлам для Windows Server 2012 xampp?

ОБНОВИТЬ

После еще нескольких часов тестирования выяснилось, что на моем сервере Windows данные в греческих символах, которые я отправляю через форму, не отображаются должным образом, поскольку Windows отображает их в кодировке Windows-1251. В phpmyadmin все они отображаются правильно, но если я поставлю точку останова в середине работающей системы, они будут выглядеть так же, как на скриншоте, который я показал. Кроме того, набор символов моих заголовков ответов - Windows-1251 для Windows, utf-8 для ubuntu. Итак, я попытался преобразовать свои данные utf-8 в windows-1252, но все же мой ввод на греческом языке превратился в вопросительные знаки. Все еще нет решения

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
364
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для тех, кто страдает от той же проблемы, что и я, в основном греческих разработчиков, вот ответ на создание папок и файлов с греческими именами из пользовательского ввода:

  1. Измените языковой стандарт системы на греческий (или желаемый), например так
  2. Когда вы получаете ввод через форму (при условии, что кодировка ввода - UTF-8), преобразуйте ее в ISO-8859-1 или Windows-1253. Если вы конвертируете его в Windows-1253, вы можете использовать только php-функцию iconv. Для ISO-8859-1 вы можете использовать mb_convert_econding. Вот так:

    $input = iconv('UTF-8', 'Windows-1253', $input)

    ИЛИ ЖЕ

    $input = mb_convert_encoding($input, 'ISO-8859-1')

  3. Теперь вы готовы создать свою папку на греческом языке. Имейте в виду, что Windows-1252 или Windows-1251 НЕ поддерживают греческие символы, а Windows-1253 отображает их правильно, только если вы также измените языковой стандарт системы на греческий.

  4. Вы еще не закончили! В зависимости от кодировки вашей базы данных (в моем случае это была UTF-8) вы ИМЕЮТ конвертируете строку обратно в UTF-8, если вы планируете ее сохранить. Или вы можете сделать копию в самом начале. В любом случае не храните преобразованный ввод в своей базе данных, иначе вы получите кучу сохраненной тарабарщины.

Надеюсь, это избавит кого-то от неприятностей, через которые мне пришлось пройти!

Другие вопросы по теме