Chrome扩展程序ajax发送格式错误的重音字符

时间:2015-12-16 14:24:24

标签: javascript jquery ajax google-chrome google-chrome-extension

我在chrome扩展程序上使用jQuery发送一个AJAX POST请求,但数据没有按预期到达,重音字符变得格格不入。

“HÄGERSTEN”字样变为“H”GERSTEN“。

文本在控制台等中显示正常,只有通过AJAX才会出现如上所述的其他页面。我的AJAX调用是基本的,我通过jQuery $ .ajax发送数据对象。我已尝试使用和不使用contentType,UTF-8和ISO-8859-1。没有区别。

这就是我调用AJAX的方式:

var newValues = {name: 'HÄGERSTEN'}

$.ajax({
    url: POST_URL,
    type: 'POST',
    data: newValues,
    success: function() ...
});

newValues对象有更多值,但我从表单中检索它们。但是,我尝试将这些值手动指定为newValues['name'] = 'ÄÄÄÄ';,但仍会导致同样的问题。

我发送AJAX的页面的原始表单元素包含属性accept-charset="iso-8859-1"。也许这很重要。

目标网站正在使用Servlet/2.5 JSP/2.1。只是因为它可能会有所作为。

我认为这是一个编码问题,因为我理解应该是因为Chrome扩展要求脚本文件是UTF-8编码的,这可能与插件运行的网站和目标AJAX页面(相同)有冲突网站)使用ISO-8859-1编码,但我不知道如何处理它。我已经尝试了几种解码/编码UTF-8到ISO-8859-1和其他技巧的方法,但没有成功。

我尝试在我的值上使用encodeURIComponent,这只会让它们显示在显示我通过POST发送的值的表单上,例如H%C3%84GERSTEN

我无法访问网站服务器,无法告诉您这是否是他们身边的问题,但我不会这么想。

更新

现在我已经了解POST数据必须以UTF-8发送!那么转换不是问题吗?

4 个答案:

答案 0 :(得分:2)

我不知道它是否可以使用POST数据和AJAX解决。也许如果我进行纯JavaScript XHR AJAX调用,我可能能够以我喜欢的方式发送POST数据。我不知道。

然而,在我的绝望中,我尝试了我的最终选择(或者似乎是这样);将请求作为GET数据发送。我很幸运,目标页面接受了GET数据。

显然问题仍然存在,因为我以相同的方式发送数据,采用UTF-8编码。因此,我不是将数据作为对象发送,而是使用escape将数据解析为具有我自己的函数的URL友好字符串,确保它们是ISO-8859-1友好的(因为encodeURIComponent将URI编码为UTF-8而escape对字符串进行编码,使其与ISO-8859-1兼容。

简化了我头痛的功能:

function URLEncodeISO(values) {
   var params = [];
   for(var k in values) params[params.length] = escape(k) + '=' + escape(values[k]);
   return params.join('&');
}

答案 1 :(得分:1)

似乎数据在发送时是UTF-8编码的,并且在服务器端没有正确解码。它必须在服务器端解码。使用以下编码和解码功能对其进行测试:



function encode_utf8(s) {
  return unescape(encodeURIComponent(s));
}

function decode_utf8(s) {
  return decodeURIComponent(escape(s));
}

var encoded_string = encode_utf8("HÄGERSTEN");
var decoded_string = decode_utf8(encoded_string);
document.getElementById("encoded").innerText = encoded_string;
document.getElementById("decoded").innerText = decoded_string;

<div>
Encoded string: <span id="encoded"></span>
</div>
<div>
Decoded string: <span id="decoded"></span>
</div>
&#13;
&#13;
&#13;

答案 2 :(得分:1)

客户端字符编码并不完全取决于您(从全世界不同用户那里开始使用页面:中文,意大利语......)而在服务器端,您需要为您的目的处理编码

因此,Ajax-POST中的数据可以继续采用UTF8编码,但在您的服务器端,您可以执行以下操作:

PHP:

$ name = utf8_decode($ _ POST ['name']);

JSP:

request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");

答案 3 :(得分:1)

我们也面临同样的情况,但在我们的情况下,我们总是使用JSON.stringify发送参数 为此,您必须进行更改,1)在通过AJAX调用页面时,您必须添加content-type标记,以定义发送的编码数据

$.ajax
    ({
        type: "POST",
        url: POST_URL,
        dataType: 'json',//In our case the datatype is JSON
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify(newValues),//I always use parameters to be sent in JSON format

修改
在更清楚地阅读了您的问题后,我开始知道您的服务器端JSP使用ISO-8859-1编码并阅读了一些帖子,我开始知道所有POST method data will be transmitted using UTF-8如上所述。

  

根据W3C XMLHTTPRequest标准,POST数据将始终使用UTF-8字符集传输到服务器

但是在阅读帖子jquery-ignores-encoding-iso-8859-1时,iappwebdev发布了一个可能有用且可以帮助您的解决方法,

 $.ajax({
    url: '...',
    contentType: 'Content-type: text/plain; charset=iso-8859-1',
    // This is the imporant part!!!
    beforeSend: function(jqXHR) {
        jqXHR.overrideMimeType('text/html;charset=iso-8859-1');
    }
});

以上代码取自Code Posted by iappwebdev