Внутренне наше приложение PHP использует UTF-8, и мы обрабатываем файлы .csv и файлы с фиксированной шириной (текстом). Мы написали несколько хороших библиотек для работы с этими файлами (классы по существу).
Недавно мы добавили возможность администраторам загружать файлы этих типов, чтобы они могли обрабатываться и быстро возникали проблемы в нескольких ОС. Вскоре мы поняли, что файлы, которые читаются, имеют разные кодировки для нашего приложения (например, Windows-1252 или ISO-8859).
Поскольку невозможно контролировать, какое кодирование файлов представлено нам, мой вопрос: Каков наилучший способ обработки загруженных текстовых файлов с различными кодировками? В настоящее время я могу представить два решения:
Я также подумал о них и о них:
Мысли, пожалуйста?
Редактировать: мне очень интересно знать, где применять, архитектурно, кодирование / преобразование символов должно происходить – это в момент ввода или во время использования файлов?
Это сложно, и нет идеального решения.
Например, phpMyAdmin предлагает пользователю возможность указать кодировку загруженного файла. Увидев, что все автоматические методы обнаружения не на 100% надежны, если это вообще возможно, это лучший способ пойти ИМО.
Диалоговое окно импорта, которое позволяет пользователю выбирать правильную кодировку при просмотре предварительного просмотра того, как выглядят их данные в этой кодировке, может быть оптимальным.
Способ сделать это может быть
Получите загруженный файл и сохраните его во временном файле
Отобразите диалог с выпадающим выбором наиболее важных кодировок
Имейте iframe, который, когда выбранное значение в раскрывающемся списке изменит, преобразует содержимое загруженного файла с помощью iconv()
(source = выбранная кодировка; target = utf-8) и показывает предварительный просмотр.
Когда пользователь выбирает кодировку, сделайте окончательный iconv()
и сохраните файл как UTF-8.
Автоматическое определение кодировки для CSV может быть затруднено, основываясь на моем собственном опыте. Он надежный только для небольшого подмножества кодировок (например, семейства UTF и некоторых других). В этом отношении предложения Пекки направлены в правильном направлении – путем размещения бремени идентификации правильного кодирования у конечного пользователя.
Сохранение UTF8 в качестве внутреннего формата – хорошая идея, но я предлагаю сохранить проблемы с кодировкой отдельно от обработки CSV, поскольку сам формат не имеет правил о кодировании. Хотя верно, что декодирование «на лету» несколько более эффективно, увеличение сложности кода может не оправдать выигрыш. Сохранение специализированных компонентов программного обеспечения всегда является хорошей идеей.
Преобразование символов должно происходить внутри серверного контроллера, прежде чем передавать управление процессору CSV, если система придерживается MVC.