Intereting Posts
Совет по канадскому провайдеру SMS-шлюза SQLSTATE : базовая таблица или представление не найдены: 1146 Таблица X не существует Как установить upload_max_filesize в .htaccess? Результаты генерации PDF в ERR_INVALID_RESPONSE в Chrome SQLSTATE : ошибка синтаксиса или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL – PHP – PDO Регулярное выражение PHP для извлечения ссылки / кода TwitPic, если присутствует Как я могу ввести доктрину в службу Symfony2 Преобразовать GUID в массив байтов с помощью PHP? Корреляция URL-адресов PHP, сохраняющая недопустимые URL-адреса Действительно ли инъекция SQL возможна путем добавления второго запроса? Драйвер php MongoDB заставляет apache на XAMPP OS X терпеть неудачу Как захватить IP: PORT с регулярным выражением? Настройка конфигурации display_error PHP в .htaccess «Mysqli_real_escape_string» достаточно, чтобы избежать SQL-инъекций или других SQL-атак? Каков наилучший способ загрузки и хранения изображений на сайте?

Каков наилучший способ обработки загруженных текстовых файлов с различными кодировками?

Внутренне наше приложение PHP использует UTF-8, и мы обрабатываем файлы .csv и файлы с фиксированной шириной (текстом). Мы написали несколько хороших библиотек для работы с этими файлами (классы по существу).

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

Поскольку невозможно контролировать, какое кодирование файлов представлено нам, мой вопрос: Каков наилучший способ обработки загруженных текстовых файлов с различными кодировками? В настоящее время я могу представить два решения:

  • Когда файл получен, определите его кодировку и преобразуйте ее в UTF-8, а затем повторно сохраните. Остальная часть системы тогда должна быть только UTF-8 и может игнорировать проблемы с кодировкой.
  • Измените библиотеку csv / fixed width, чтобы они сами стали кодировать

Я также подумал о них и о них:

  • Преобразование ввода делает остальные библиотеки меньшими и уменьшает дублирование, однако оно кажется расточительным с точки зрения обработки
  • Сделать библиотеки внутренне осведомленными – это, кажется, связано с большим количеством кода, но может быть более быстрым

Мысли, пожалуйста?

Редактировать: мне очень интересно знать, где применять, архитектурно, кодирование / преобразование символов должно происходить – это в момент ввода или во время использования файлов?

Это сложно, и нет идеального решения.

Например, phpMyAdmin предлагает пользователю возможность указать кодировку загруженного файла. Увидев, что все автоматические методы обнаружения не на 100% надежны, если это вообще возможно, это лучший способ пойти ИМО.

Диалоговое окно импорта, которое позволяет пользователю выбирать правильную кодировку при просмотре предварительного просмотра того, как выглядят их данные в этой кодировке, может быть оптимальным.

Способ сделать это может быть

  • Получите загруженный файл и сохраните его во временном файле

  • Отобразите диалог с выпадающим выбором наиболее важных кодировок

  • Имейте iframe, который, когда выбранное значение в раскрывающемся списке изменит, преобразует содержимое загруженного файла с помощью iconv() (source = выбранная кодировка; target = utf-8) и показывает предварительный просмотр.

  • Когда пользователь выбирает кодировку, сделайте окончательный iconv() и сохраните файл как UTF-8.

Автоматическое определение кодировки для CSV может быть затруднено, основываясь на моем собственном опыте. Он надежный только для небольшого подмножества кодировок (например, семейства UTF и некоторых других). В этом отношении предложения Пекки направлены в правильном направлении – путем размещения бремени идентификации правильного кодирования у конечного пользователя.

Сохранение UTF8 в качестве внутреннего формата – хорошая идея, но я предлагаю сохранить проблемы с кодировкой отдельно от обработки CSV, поскольку сам формат не имеет правил о кодировании. Хотя верно, что декодирование «на лету» несколько более эффективно, увеличение сложности кода может не оправдать выигрыш. Сохранение специализированных компонентов программного обеспечения всегда является хорошей идеей.

Преобразование символов должно происходить внутри серверного контроллера, прежде чем передавать управление процессору CSV, если система придерживается MVC.