我在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发送!那么转换不是问题吗?
答案 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;
答案 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');
}
});