Пользователь отправил CSV файл для загрузки концерна UTF-8 - PullRequest
0 голосов
/ 19 апреля 2011

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

В моей базе данных есть сопоставление utf8_general_ci, а кодировка веб-сайта установлена ​​в utf-8.

Как я могу убедиться, что при вставке данных из CSV в мою базу данных для отображения на веб-сайте установлена ​​правильная кодировка?

Должен ли я тестировать каждую строку, используя что-то вроде mb_detect_encoding (кажется, немного потребляет память), или я могу просто utf8_encode всю строку Или мне вообще не о чем беспокоиться?

1 Ответ

1 голос
/ 19 апреля 2011

Автоопределение кодировки файла, отправленного пользователем, действительно крайне шатко.

Рассмотрим ручной подход:

  • Попросите пользователя загрузить файл.

  • В iframe покажите ихпредварительный просмотр того, как данные будут вставлены.(как это делает OpenOffice при импорте неизвестного файла в электронную таблицу).Примером этого является здесь

  • Рядом с этим покажите раскрывающийся список, предлагающий все соответствующие кодировки.

  • Если пользователь переключается на другую кодировку, обновите предварительный просмотр на лету, используя iconv():

    $data = iconv($chosen_encoding, "utf-8", $data);
    
  • Один разпользователь подтвердил, что данные отображаются правильно в выбранной кодировке, сделайте окончательную iconv() для данных и вставьте их в базу данных.

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

Re Ваш комментарий:

Я действительно хочу сделать это прозрачным для пользователя.Будет ли выполнение utf8_encode над строкой, по крайней мере, гарантировать правильную кодировку независимо от того, или он испортит все данные?

utf8_encode - это просто синоним для iconv ("iso-8859")-1 "," utf-8 ", $ data).Если входящие данные не ISO-8859-1, они будут испорчены процессом.Это сложная проблема.

Если вам нужно, чтобы это было прозрачно, вам придется попытать счастья с mb_detect_encoding - к полному файлу, к сожалению, потому что ISO-8859-1 и UTF-8 используют один и тот же набор базы (ASCII) символы, но отличаются во всем остальном, как Umlauts ÄÖÜ.

Обратите внимание, что обнаружение кодировки практически бесполезно, если файлы поступают со всего мира (т. Е. Может иметь любую кодировку)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...