场景:原本是一个文件下载接口,由于需求是要在新窗口中打开而不是下载,因此使用$.ajax去请求,能够获得文件的文本内容,不过内容中的中文所有都是乱码。下面给出使用$.ajax时的代码(不全):html
$.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处理了。ajax
解决方案:尝试使用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...)服务器
使用上面的函数,发现问题获得解决。ide