2009-03-18 1 views
4

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

$.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, но когда мне приходится обрабатывать пост async из IE 7 с акцентированными символами, у меня есть проблема: я всегда получаю недопустимые символы (возможно, utf-8)? EG Я печатаю в виде: ааааааа, и я получаю в своем запросе это значение: Поскольку набор символов запроса правильно установлен в 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: [email protected] 
Attribute: org.apache.struts.globals.ORIGINAL_URI_KEY - Value: /conv/ajaxvalidate.do 
Attribute: errors - Value: [email protected] 
Attribute: org.apache.struts.action.MODULE - Value: [email protected] 
Attribute: weblogic.servlet.request.sslsession - Value: [email protected] 
field: nome - value: àààààààà - action: /endtim 

ответ

4

CONTENTTYPE: «применение/х-WWW-форм-urlencoded; кодировок = ISO-8859-1"

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

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

Так что вы можете сделать, это либо:

1: создать форму-urlencoded содержание 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: потеряйте 'charset' и оставьте сообщение UTF-8 как обычно, и ваш сервлет понимает входящий UTF-8. Это, как правило, лучше всего, но будет означать, что вы с помощью конфигурации контейнера сервлетов должны выбрать правильную кодировку. Для Weblogic это, по-видимому, означает using an <input-charset> element в weblogic.xml. И к тому времени вы смотрите на перенос всего приложения на UTF-8. Это ни в коем случае не плохая вещь (сайты, не поддерживающие Unicode, являются sooo 20-го века!), Но вполне может быть много работы.

+0

Спасибо bobince, я попробую конвертировать страницы, но это займет некоторое время. Я пробовал js encodeURI(), и он работал, но мне пришлось вручную декодировать каждое поле со стороны сервера запросов. Я также попытался поместить xhr в utf-8 со страницами, все еще находящимися в iso-8859-1, и, похоже, он работает. Действительно странно .. –

2

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

jQuery.ajaxSetup ({ CONTENTTYPE: "приложения/JSON; кодировка = UTF-8" });

Что переопределяет поведение добавления приложения/x-www-form-urlencoded к типу содержимого в IE.

0

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

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

Good Luck & Мир во всем! Seba

 Смежные вопросы

  • Нет связанных вопросов^_^