场景:本来是一个文件下载接口,因为需求是要在新窗口中打开而不是下载,所以使用$.ajax去请求,可以得到文件的文本内容,不过内容中的中文全部都是乱码。下面给出使用$.ajax时的代码(不全):
$.ajax({
type: 'get',
url: targetUrl,
complete : function(xhr,status){ //请求完成后最终执行参数
if(status === 'success') {
var respContentType = xhr.getResponseHeader('Content-Type'); //这里得到的是'text/html'
var respText = xhr.responseText; //此处得到的字符串中的中文为乱码
}
}
})
分析原因:首先观察控制台的返回值,在network中发现response中的文本没有出现乱码,放回的html文本中meta的charset为 'GB2312',而preview中显示出现了问题,而且直接在浏览器中打开这个路径的时候下载得到的文件也是没有乱码的,返回的请求头的contentType为 'text/html',这里没有指定编码格式,所以感觉是返回的时候因为没有指定编码格式,所以ajax使用了utf-8处理了。
解决方案:尝试使用xmlHttpRequest来发送请求,代码如下:
function xhrLoadText(url, onSuccess, onFailure) {
onSuccess = onSuccess || function _onSuccess(data) {};
onFailure = onFailure || function _onFailure() {};
var xhr = new XMLHttpRequest();
xhr.open('GET', url, true);
if (xhr.overrideMimeType) {
xhr.overrideMimeType('text/html; charset=GB2312'); // 关键是这里
}
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
if (xhr.status == 200 || xhr.status === 0) {
onSuccess(xhr.responseText);
} else {
onFailure();
}
}
};
xhr.onerror = onFailure;
xhr.ontimeout = onFailure;
try {
xhr.send(null);
} catch (e) {
onFailure();
}
}
这里对overrideMimeType做一下说明:XMLHttpRequest 的 overrideMimeType 方法是指定一个MIME类型用于替代服务器指定的类型,使服务端响应信息中传输的数据按照该指定MIME类型处理。例如强制使流方式处理为"text/xml"类型处理时会被使用到,即使服务器在响应头中并没有这样指定。此方法必须在send方法之前调用方为有效。(https://developer.mozilla.org...)
使用上面的函数,发现问题得到解决。