Автоопределение кодировки файла, отправленного пользователем, действительно крайне шатко.
Рассмотрим ручной подход:
Попросите пользователя загрузить файл.
В 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 ÄÖÜ.
Обратите внимание, что обнаружение кодировки практически бесполезно, если файлы поступают со всего мира (т. Е. Может иметь любую кодировку)