Помогите с правильной кодировкой символов - PullRequest
1 голос
/ 15 апреля 2010

У меня есть HTML-форма, которая иногда отправляется с акцентированными символами: à, è, ì, ò, ù

У меня есть PHP-скрипт, который экспортирует отправленные формы в формат CSV, когда я смотрю на формат CSV в текстовом редакторе (например, в vim или блокноте), символы выглядят нормально, но при открытии в Open Office или Word я получить некоторые интересные результаты:

Я также передаю эти данные в salesforce и получаю сообщение об ошибке: «Объект« Atilde »был указан, но не объявлен».

Что я могу сделать, чтобы обеспечить переносимость моего файла CSV? Как правильно обращаться с кодировкой?

Мой HTML-файл имеет тип содержимого, заданный следующим образом: Content-Type: text / html; кодировка = UTF-8 Данные хранятся в MySQL как сортировка latin1_swedish_ci.

Ответы [ 4 ]

3 голосов
/ 15 апреля 2010

Общая путаница с кодировкой! : -)

Набор символов таблицы

Набор символов таблицы MySQL определяет только то, какую кодировку MySQL следует использовать для внутреннего использования, и, следовательно, допустимый диапазон символов.

  • Если вы установите его на Latin-1 (он же ISO 8859-1 ), вы не сможете хранить международные символы в вашей таблице.
  • Важно, что набор символов не влияет на кодировку, используемую MySQL при взаимодействии с вашим PHP-скриптом.
  • В таблице сличения указаны правила сортировки.

Набор символов подключения

Набор символов соединения MySQL определяет кодировку, в которую вы получаете данные таблицы (и должна отправлять данные в MySQL).

  • Кодировка устанавливается с помощью SET NAMES, например, SET NAMES "utf8".
  • Если это не соответствует кодировке таблицы, MySQL автоматически конвертирует данные на лету.
  • Если это не соответствует вашему набору символов страницы, вам придется вручную выполнить преобразование набора символов в PHP, используя, например, utf8_encode или mb_convert_encoding .

Набор символов страницы

Набор символов страницы, указанный с помощью заголовка Content-Type , сообщает браузеру, как интерпретировать вывод PHP-скрипта.

  • Как заголовок HTTP, он не сохраняется при сохранении файла из браузера. Таким образом, информация недоступна для OpenOffice или других программ.

Рекомендации

В идеале вы должны использовать одну и ту же кодировку во всех трех местах, а в идеале эта кодировка должна быть UTF-8.

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

Лучше всего использовать Latin-1 для CSV-файла. Тем не менее, я бы по-прежнему использовал UTF-8 для таблиц и наборов символов соединения, а также UTF-8 для HTML-страниц.

Если вы используете UTF-8 для набора символов соединения (выполнив SET NAMES "utf8" после подключения), вам нужно будет выполнить текст через utf8_decode для преобразования в Latin-1.

Проблема этой сущности

Я также передаю эти данные в salesforce и получаю сообщение об ошибке: «Объект« Atilde »был указан, но не объявлен».

Звучит так, будто вы передаете код HTML в контексте XML и не связаны с наборами символов. Попробуйте выполнить текст через html_entity_decode .

0 голосов
/ 15 апреля 2010

Убедитесь, что вы записываете файл CSV как UTF-8. См. http://www.php.net/manual/en/function.fwrite.php#55054, если вы не знаете, как это сделать.

(Кроме того, ваша таблица sql должна использовать utf8, а не latin1)

0 голосов
/ 15 апреля 2010

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

Какую кодировку кодировки использовать? CSV не определяет кодировку кодировки - так что я бы выбрал кодировку Unicode, предположительно UTF8. Но некоторые потребители CSV (например, Excel) могут не быть довольны этим. Если вы ограничены «западными» языками, то лучше использовать latin1 или его варианты (iso-8859-1 или iso-8859-15). Но тогда (в любом случае, на самом деле) вы должны подумать о преобразовании ввода пользователя в вашу конкретную кодировку - и что делать, если есть недопустимые символы.

(Кстати: то же самое относится и к преобразованию html-input-to-db - вы используете latin1 для своей базы данных, спрашивали ли вы себя, что произойдет, если пользователь введет не латинский символ 1? .

0 голосов
/ 15 апреля 2010

Кроме того, какой тип документа вы установили?

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Попробуйте использовать функцию htmlentities () для любого текста, который отображается неправильно.

Вы также можете посмотреть PHP Нормализатор .

...