Каков наилучший способ обработки загруженных текстовых файлов различных кодировок? - PullRequest
2 голосов
/ 26 февраля 2011

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

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

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 26 февраля 2011

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

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

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

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

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

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

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

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

2 голосов
/ 26 февраля 2011

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

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

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

...