Проблемы с кодировкой создания папок-файлов Php - PullRequest
0 голосов
/ 26 мая 2018

У меня проблемы с созданием файлов и папок с использованием CakePHP 3 * Папка и файловые библиотеки (хотя это php's 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

В моей среде Ubuntu она работает нормально, однако на Windows Server 2012 R2 греческие части символов выглядят так, будто имеют проблемы с кодировкой, вот так (извиняюсь за плохое качество) enter image description here

Я пробовал несколько вещей, и вот что я знаю до сих пор:

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

недопустимая последовательность ввода в позиции

Вот основной код:

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));

'/ входящие / документы/someUser/εξερχομενο/Κ.900'

'�� / входящие / документы / someUser / ���������� / �.900 '

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

' Входящие / Documents / someUser / ��������� / �.900 '

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

[https://secure.php.net/function.iconv'>function.iconv]: Обнаружен недопустимый символ во входной строке

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

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

ОБНОВЛЕНИЕ

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

1 Ответ

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

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

  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), вы HAVE конвертируете строку обратно в UTF-8, если планируете хранитьЭто.Или вы можете сделать копию в самом начале.В любом случае, не сохраняйте преобразованные входные данные в вашей базе данных, иначе у вас будет куча хранившейся тарабарщины.

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

...