Неправильная кодировка в запросах jsonp ajax

Я делаю запрос 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, происходит сбой с той же ошибкой, но если я копирую его в Notepad ++ в режиме ANSI перед отправкой обратно на консоль, он работает нормально. Кодировка в заголовке ответа — utf-8.

Что может быть причиной того, что jquery не может разобрать эти запросы?

Изменить: я использую node.js с экспресс-сервером.

Это все тело ответа, которое я получаю от запроса 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.

Объект преобразуется в строку на стороне сервера с помощью JSON.stringify после загрузки из MongoDB через Mongoose.

Пример сбоя запроса json: http://like-my-style.com/#!single/9709590 . С другими продуктами работает нормально.


person Thomas    schedule 17.04.2011    source источник
comment
Кажется, это происходит со стороны сервера. Что вы используете для генерации ответа jsonp?   -  person Pekka    schedule 18.04.2011
comment
Я заметил это в строке: hüfte - может быть проблема в этом?   -  person Hogan    schedule 18.04.2011
comment
@ Хоган, скорее всего. есть еще вайс. Я думаю, что это терпит крах на таких персонажах. А может utf-8 не любит тех. Я поместил его через JSONLint, и JSON действителен./   -  person Raynos    schedule 18.04.2011
comment
Тот же вызов API отлично работает с другими объектами json, содержащими символы ä, ö и ü.   -  person Thomas    schedule 18.04.2011
comment
@Raynos JSON тоже действителен для меня, когда я копирую его отсюда, но он недействителен, когда я копирую его непосредственно из firebug и вставляю в консоль firebug.   -  person Thomas    schedule 18.04.2011
comment
@ Томас Я не понимаю, что ему не нравится.   -  person Raynos    schedule 18.04.2011


Ответы (1)


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

data == null проверяет как значение null, так и undefined, поэтому вам нужно проверить только одно, а не оба.

Что касается вашей фактической проблемы, кажется, что ваш код узла не создает правильные данные JSON. попробуйте использовать JSON.stringify для создания своего ответа, чтобы вы были уверены, что он действителен в формате json.

Подмножество ваших данных "weiß", попробуйте удалить все нестандартные символы из своего описания и посмотреть, устранит ли это проблему.

person Raynos    schedule 17.04.2011
comment
Точно так же JSON преобразуется в строку на стороне сервера. Я добавил фактический объект, вызывающий проблемы. - person Thomas; 18.04.2011
comment
Проблема не исчезает таким образом, другие продукты со специальными символами работают нормально. - person Thomas; 18.04.2011
comment
@ Томас, я в тупике. Не имея возможности физически отлаживать ваш код, я не могу вам помочь. - person Raynos; 18.04.2011