jsonp ajax 请求中的错误字符集

Posted

技术标签:

【中文标题】jsonp ajax 请求中的错误字符集【英文标题】:Wrong charset in jsonp ajax requests 【发布时间】:2011-08-07 11:02:47 【问题描述】:

我正在通过以下方式执行 ajax 请求:

function apiCall(resource, data, callback) 
   if(data == undefined || data == null) data = ;
   $.ajax(
       dataType: 'jsonp',
       data: data,
       url: nodeUri + "/" + resource
   ).success(callback).error(function(jqXHR, textStatus, errorThrown)  alert(errorThrown); );

虽然这适用于大多数调用,但一些 jsonp 请求失败,在带有此字符串的 firebug 控制台中显示错误“未终止的字符串文字”:

jQuery151005229747375124583_1303069060...size chart women)\r\n\r\nx-small \r\n


当我复制请求正文并将 jquery 回调函数名称替换为 console.log 时,它会失败并出现相同的错误,但如果我在将其发布回控制台之前以 ANSI 模式将其复制到 Notepad++,它工作正常。响应标头中的字符集是 utf-8。

jquery 无法解析这些请求的原因可能是什么?

编辑:我正在使用 node.js 和 express 作为服务器。

这是我从 ajax 请求中得到的整个响应体:

jQuery151019804588618633323_1303079165535("price":"currency_code":"EUR","cents":12000,"image_colors":["blue":99,"hex":"636363","green":99,"red":99,"blue":255,"hex":"ffffff","green":255,"red":255],"default_image":"big":"http://s32.dawandastatic.com/Product/9709/9709590/big/1271709158-113.jpg?20101021091023","mini":"http://s32.dawandastatic.com/Product/9709/9709590/mini/1271709158-113.jpg?20101021091023","listview":"http://s32.dawandastatic.com/Product/9709/9709590/listview/1271709158-113.jpg?20101215201220","thumb":"http://s32.dawandastatic.com/Product/9709/9709590/thumb/1271709158-113.jpg?20101021091023","listing":"http://s32.dawandastatic.com/Product/9709/9709590/listing/1271709158-113.jpg?20101021091023","full":"http://s32.dawandastatic.com/Product/9709/9709590/full/1271709158-113.jpg?20101021091023","long":"http://s32.dawandastatic.com/Product/9709/9709590/long/1271709158-113.jpg?20101021091023","pin":"http://s32.dawandastatic.com/Product/9709/9709590/pin/1271709158-113.jpg?20101215201220","user":"name":"goodmorningmidnight","id":1791458,"restful_path":"/users/1791458","ranking":0.6636759628828178,"likes":0,"dislikes":0,"_id":"4da23faa2264ef7b9defbdac","base_price":null,"category":"name":"1031","id":530,"restful_path":"/categories/530","category_id":530,"created_at":null,"description":"Rock / grau, weiß\r\n\r\n[ m a t e r i a l ]\r\n100 % wolle (leichte sommerwolle)\r\n\r\n[ d e t a i l s ]\r\nasymmetrisch\r\npatchwork design\r\nlagenlook\r\n\r\n[ s i z e s ]\r\nXS, S, M, L \r\n\r\n[ c a r e ]\r\nschonwäsche 30°C, mit ähnlichen farben waschen, nicht bleichen, nicht im wäschetrockner trocknen, bügeln mit mittlerer stufe\r\n\r\n[ s i z e c h a r t ]\r\n\r\n(size chart women)\r\n\r\nx-small \r\n
brust: (76-80 cm) 
\r\ntaille: (60-64 cm) 
\r\nhüfte: (84-88 cm)\r\n\r\nsmall 
\r\nbrust: (84-88 cm) 
\r\ntaille: (68-72 cm) 
\r\nhüfte: (92-96 cm)\r\n\r\nmedium 
\r\nbrust: (92-96 cm) 
\r\ntaille: (76-80 cm) 
\r\nhüfte: (100-104 cm)\r\n\r\nlarge 
\r\nbrust: (100-104 cm) 
\r\ntaille: (84-88 cm) 
\r\nhüfte: (108-112 cm)\r\n","ending":null,"id":9709590,"materials":"","name":"1.01 (all your summer songs)","product_url":"http://de.dawanda.com/product/9709590-101-all-your-summer-songs","quantity":1,"restful_path":"/products/9709590","tags":"");

如果将 JSON 转换为 ANSI,我认为它是可以的,但在 utf-8 中似乎像这样被破坏了。

对象通过 Mongoose 从 MongoDB 加载后,在服务器端使用 JSON.stringify 进行字符串化。

json请求失败的例子:http://like-my-style.com/#!single/9709590。它适用于其他产品。

【问题讨论】:

这似乎来自服务器端。你用什么来生成 jsonp 响应? 我在字符串中注意到了这一点:hüfte——这可能是问题所在吗? @Hogan 可能。还有“weiß”。我认为它会在这类角色身上崩溃。或者也许 utf-8 不喜欢那些。我把它通过 JSONLint 和 JSON 是有效的。/ 相同的 API 调用适用于其他包含 ä、ö 和 ü 字符的 json 对象。 【参考方案1】:

if(data == undefined || data == null) data = ;

data == null 会同时检查 nullundefined 的值,因此您只需要检查其中一个而不是同时检查两者。

至于您的实际问题,您的节点代码似乎没有创建正确的 JSON 数据。尝试使用JSON.stringify 创建您的响应,这样您就可以确信它是有效的 json。

您的数据子集是“weiß”尝试从您的描述中删除所有非标准字符,看看是否可以解决问题。

【讨论】:

JSON 在服务器端完全像这样被字符串化。我添加了导致问题的实际对象。 问题并没有这样消失,其他带有特殊字符的产品也可以正常工作。 @Thomas 我很难过。如果无法实际调试您的代码,我无法帮助您。

以上是关于jsonp ajax 请求中的错误字符集的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Ajax 请求包含数据类型:“jsonp”错误? [复制]

AJAX中的dataType

使用 jsonp 错误的 jQuery ajax 请求

带有 jsonp 内容类型的 jQuery.ajax 请求后的解析器错误

在 JSONP-Ajax 请求后获取 JSON 元素的奇怪错误

JQuery的Ajax跨域请求的