Еще одна проблема кодирования JQuery в IE - PullRequest
4 голосов
/ 18 марта 2009

Я пишу итальянский веб-сайт, на котором мне нужно проверить некоторые входные данные с помощью вызова xhr. Мой код для запроса ajax выглядит следующим образом (я использую JQuery 1.3.2):

 $.ajaxSetup({
    type: "POST",
    timeout: 10000,
    contentType: "application/x-www-form-urlencoded; charset=iso-8859-1"        
}); 


 $.ajax({
    url: "ajaxvalidate.do",
    data: {field:controlInfo.field,value:controlInfo.fieldValue},
    dataType: "json",
    complete: function() {
        //
    },
    success: function(msg) {
        handleAsyncMsg(controlInfo, msg, closureOnError);
    },
    error: function(xhr, status, e) {            
        showException(controlInfo.id, status);

    }

});

На бэкэнде у меня есть действие java Struts для обработки xhr. Мне нужно использовать кодировку ISO-8859-1 на странице, чтобы обеспечить правильную отправку данных (специально выделенных символов) при синхронной отправке.

Все работает как шарм в Firefox, но когда мне приходится обрабатывать асинхронную запись из IE 7 с акцентированными символами, у меня возникает проблема: я всегда получаю недопустимые символы (возможно, utf-8?) Например, я набираю форму ааааааа и получаю в своем запросе это значение: Ã Ã Ã Ã Ã Ã Ã Ã Ã. Так как кодировка запроса правильно установлена ​​на ISO-8859-1, я не могу понять, почему сервер все еще неправильно анализирует значение формы.

Это пример журнала со всеми заголовками запросов и ошибкой (сервер - старый Bea Weblogic 8.1):

Encoding: ISO-8859-1
Header: x-requested-with - Value: XMLHttpRequest
Header: Accept-Language - Value: it
Header: Referer - Value: https://10.172.14.36:7002/reg-docroot/conv/starttim.do
Header: Accept - Value: application/json, text/javascript
Header: Content-Type - Value: application/x-www-form-urlencoded; charset=iso-8859-1
Header: UA-CPU - Value: x86
Header: Accept-Encoding - Value: gzip, deflate
Header: User-Agent - Value: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
Header: Host - Value: 10.172.14.36:7002
Header: Content-Length - Value: 65
Header: Connection - Value: Keep-Alive
Header: Cache-Control - Value: no-cache
Header: Cookie - Value: JSESSIONID=JQJlNpVC86yTZJbcpt54wzt82TnkYmWYC5VLL2snt5Z8GTsQ1pLQ!1967684811
Attribute: javax.net.ssl.cipher_suite - Value: SSL_RSA_WITH_RC4_128_MD5
Attribute: javax.servlet.request.key-size - Value: 128
Attribute: javax.servlet.request.cipher_suite - Value: TLS_RSA_WITH_RC4_128_MD5
Attribute: javax.servlet.request.key_size - Value: 128
Attribute: weblogic.servlet.network_channel.port - Value: 7001
Attribute: weblogic.servlet.network_channel.sslport - Value: 7002
Attribute: org.apache.struts.action.MESSAGE - Value: org.apache.struts.util.PropertyMessageResources@4a97dbd
Attribute: org.apache.struts.globals.ORIGINAL_URI_KEY - Value: /conv/ajaxvalidate.do
Attribute: errors - Value: org.apache.struts.util.PropertyMessageResources@4a97e4d
Attribute: org.apache.struts.action.MODULE - Value: org.apache.struts.config.impl.ModuleConfigImpl@4aa2ff8
Attribute: weblogic.servlet.request.sslsession - Value: javax.net.ssl.impl.SSLSessionImpl@42157c5
field: nome - value: Ã Ã Ã Ã Ã Ã Ã Ã  - action: /endtim

Ответы [ 3 ]

4 голосов
/ 18 марта 2009

contentType: "application / x-www-form-urlencoded; charset = iso-8859-1"

Вы можете сказать , что вы отправляете отправку формы в виде ISO-8859-1 в заголовке, но это не значит, что вы на самом деле. jQuery использует стандартный метод JavaScript encodeURIComponent () для кодирования строк Unicode в байты строки запроса, и что всегда использует UTF-8.

В любом случае параметр «charset» для MIME-типа «application / x-www-form-urlencoded» крайне нестандартен. Поскольку для типа «x-» нет официальной регистрации MIME для этого типа, но HTML 4.01 не определяет такой параметр, и это было бы очень необычно для типа «application / *». Weblogic утверждает, что обнаружил эту конструкцию, для чего она стоит.

Итак, вы можете сделать следующее:

1: создайте содержимое в виде тела в формате POST самостоятельно, взломав его в формате ISO-8859-1 вручную, используя что-то вроде

function encodeLatin1URIComponent(str) {
    var bytes= '';
    for (var i= 0; i<str.length; i++)
        bytes+= str.charCodeAt(i)<256? str.charAt(i) : '?';
    return escape(bytes).split('+').join('%2B');
}

вместо encodeURIComponent ().

2: потерять кодировку и оставить отправку UTF-8 как обычно, и заставить ваш сервлет понимать входящий UTF-8. Это, как правило, лучше, но это будет означать, что нужно перебирать конфигурацию контейнера сервлета, чтобы он выбрал правильную кодировку. Для Weblogic это, похоже, означает с использованием элемента в weblogic.xml. И к тому времени вы собираетесь переместить все ваше приложение в UTF-8. Что ни в коем случае не плохо (сайты, не поддерживающие Юникод, ооочень 20-е столетие!), Но вполне могут потребовать много работы.

2 голосов
/ 21 мая 2009

На самом деле просто решил, что мне нужно было сделать:

jQuery.ajaxSetup ({ contentType: "application / json; charset = utf-8" });

Который переопределяет поведение добавления application / x-www-form-urlencoded в content-type в IE.

0 голосов
/ 04 июня 2010

У меня были похожие проблемы, я работал в системе комментариев к контенту на нашем испанском портале. Что, наконец, решило мою проблему, после многих часов поиска, вместо того, чтобы связываться с jQuery charset, который, кажется, использует utf-8, несмотря ни на что, это было для декодирования из utf-8 обратно в ISO-8859-1 в PHP, который обрабатывал Аякс ПОСТ. В PHP есть встроенная функция utf8_decode (), поэтому первое, что я делаю со строкой комментариев, это: $ comentario = utf8_decode ($ _ POST ['comentario']);

(а затем я использовал PHP-функции nl2br () и htmlentities (), чтобы подготовить текст для хранения с html-сущностями вместо специальных символов)

Удачи и мира всем! Seba

...