编程语言
首页 > 编程语言> > java – IE上的另一个JQuery编码问题

java – IE上的另一个JQuery编码问题

作者:互联网

我正在编写一个意大利语网站,我需要通过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可能?).
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: 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

解决方法:

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

您可以说您正在标题中发送表单提交为ISO-8859-1,但这并不意味着您实际上是. jQuery使用standand JavaScript encodeURIComponent()方法将Unicode字符串编码为查询字符串字节,并始终使用UTF-8.

在任何情况下,MIME类型’application / x-www-form-urlencoded’的’charset’参数都是高度非标准的.作为’x-‘类型,此类型没有正式的MIME注册,但HTML 4.01没有指定这样的参数,对于’application / *’类型来说这是非常不寻常的. Weblogic声称可以检测这个构造,以及它的价值.

所以你能做的是:

1:自己创建POST body form-urlencoded内容,手动将其破解成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,让你的servlet理解传入的UTF-8.这通常是最好的,但是意味着使用servlet容器配置进行调整以使其选择正确的编码.对于Weblogic,这似乎意味着在weblogic.xml中为using an <input-charset> element.到那时你正在考虑将整个应用程序移动到UTF-8.这绝不是一件坏事(非支持Unicode的网站是20世纪的!),但很可能是很多工作.

标签:jquery,java,ajax,internet-explorer,iso-8859-1
来源: https://codeday.me/bug/20190607/1193051.html