отправка формы с диакритическими символами через xmlhttprequest

Я реализовал этот метод отправки формы, который использует xmlhttpreqeust. Я увидел новую функцию HTML5, FormData, которая позволяет отправлять файлы вместе с формами. Прохладный! Однако есть проблема с акцентированными символами, особенно с теми глупыми умными цитатами, которые делает Word (да, я немного предвзято отношусь к этим символам). Раньше я использовал скрытый iframe, старый школьный метод, и у меня никогда не было проблем с множеством странных символов, которые там помещались. Но я подумал, что так будет лучше. Оказывается, большая головная боль: - /

Посмотрим на код. Моя функция javascript (обратите внимание на закомментированную строку):

var xhr = new XMLHttpRequest();
var fd = new FormData(form);

xhr.addEventListener("error", uploadFailed, false);
xhr.addEventListener("abort", uploadCanceled, false);
xhr.addEventListener("load", uploadComplete, false); 

xhr.open($(form).attr('method'), $(form).attr('action'));

//xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=ISO-8859-1");
xhr.send(fd);

Это сокращенное представление, см. Строку 1510 по адресу http://archive.cyark.org/sitemanager/sitemanager.js, чтобы просмотреть всю функцию.

Затем на странице получения php у меня вверху:

header('Content-Type: text/html; charset=ISO-8859-1'); 

Затем следует некоторый базовый php для создания строки с данными сообщения и отправки ее в качестве обновления в mysql.

Так что же мне делать? Если я раскомментирую параметр типа содержимого в javascript, он полностью нарушит данные POST в моем сценарии php. Я не знаю, в javascript, php или mysql проблема. Есть предположения?


person Landon    schedule 24.07.2012    source источник


Ответы (1)


Проблемы с кодировкой иногда трудно отладить. Короче говоря, лучшее решение - буквально использовать UTF8 как кодировку везде. То есть каждый компонент стека вашего приложения.

Кажется, что ваша страница доставляется как ISO-LATIN-1 (отправляется через HTTP-заголовок с вашего веб-сервера), что приводит к тому, что браузеры используют latin1 или какой-либо эквивалент Windows, например windows-1252, даже если у вас могут быть элементы META в HEAD вашего HTML, сообщающие пользовательским агентам о необходимости используйте UTF8. Заголовок HTTP имеет приоритет. Убедитесь, что доставка других ваших форматов файлов (особенно .js) также является UTF8. Если ваши проблемы все еще возникают после настройки всего, что связано с клиентской стороной (HTML, JS, XHR и т. Д.) Для использования UTF8, вам придется начать проверку вашей серверной части на наличие проблем.

Это может включать такие простые проблемы, как файлы PHP, которые не соответствуют UTF8 (я бы сказал, что это очень маловероятно на серверах Linux), но обычно состоит из проблем с конфигурациями mysql (сервер и клиент), кодировкой по умолчанию для базы данных и таблицы (и сопоставлением) и правильным Настройки соединения. Проблемы также могут быть вызваны неправильными настройками конфигурации PHP ini или mbstring.

Примеры (не полные; здесь используется mysql как общий пример базы данных):

Конфигурация MySQL

[mysqld]
default_character_set = utf8
character_set_client = utf8
character_set_server  = utf8
[client]
default_character_set = utf8

Обратите внимание, что эти настройки отличаются для mysql версий 5.1 и 5.5 и могут помешать запуску mysqld при использовании неправильной переменной. См. http://dev.mysql.com/doc/refman//5.5/en/server-system-variables.html и http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html. для получения дополнительной информации.

Вы можете проверить свои переменные mysql через CLI:

mysql> SHOW VARIABLES LIKE '%char%';
Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8

При создании баз данных и таблиц попробуйте использовать что-то вроде

CREATE DATABASE $db /*!40100 DEFAULT CHARACTER SET utf8 */

Настройки PHP.ini (уже должны быть по умолчанию):

default_charset = "utf-8"

Расширение PHP MB-String по умолчанию использует latin1 и его следует перенастроить, если он используется:

[mbstring]
mbstring.internal_encoding = UTF-8
mbstring.http_output = UTF-8
...some more perhaps...

Настройки веб-сервера (используемый в качестве примера Apache применим и к другим серверам):

# httpd.conf
AddDefaultCharset UTF-8

Исходные коды PHP могут использовать настройки заголовка, например:

header('Content-type: text/html; charset=UTF-8');

Настройки оболочки (bash):

# ~/.profile
export LC_CTYPE=en_US.UTF-8
export LANG=en_US.UF-8

Вышеупомянутый список представлен здесь только для того, чтобы дать вам представление о том, какие подводные камни могут поджидать вас в определенных ситуациях. Каждый компонент используемого вами веб-стека должен иметь возможность использовать UTF8 и должен быть правильно настроен для этого. Тем не менее, для решения большинства проблем обычно достаточно простого правильного HTTP-заголовка UTF8. Удачи! :-)

person graste    schedule 24.07.2012
comment
Спасибо за ваш ответ, он очень подробный. У меня есть таблица базы данных с сопоставлением latin1_swedish_ci. Если я изменю его на utf8_unicode_ci, могу ли я сломать какой-либо из символов? Или, другими словами, потенциально некоторые символы в latin1 не будут правильно отображаться в utf8? Нужно ли мне беспокоиться об этом и вручную просматривать все мои данные и исправлять их? - person Landon; 25.07.2012
comment
Если выгрузка и повторная вставка или другие способы слишком сложны, я думаю, что не должно возникнуть проблем с преобразованием ваших таблиц с помощью ALTER TABLE foo CONVERT TO CHARACTER SET UTF8 ;. С другой стороны, я не эксперт по базам данных или кодированию, и может потребоваться выполнить многоэтапное преобразование через двоичные форматы (но я так не думаю). Эта страница может быть полезной. Я просто выполнял ALTER TABLE и проверял результаты. :-) - person graste; 26.07.2012