2015-05-29 2 views
0

У меня возникла проблема с тем, что XMLHttpRequest отключает тело кодированного json сообщения при использовании Emoji в теле.Корпус XMLHttpRequest отключен при использовании unicode

var emoji = '"\u2764\uFE0F"'; 

var data = { 
     id: messageid, time: new Date(), 
     layout: { 'type': "message", title: emoji, body: emoji, largeIcon: "http://site/icons/icon.png", foregroundColor: "#445566", backgroundColor: "#222222" }, 
     createNotification: { 
      layout: { 'type': "genericNotification", title: emoji, subtitle: emoji, largeIcon: "http://site/icons/icon.png" } 
      } 
    }; 

jsonenc = JSON.stringify(data); 

console.log(jsonenc) //displays data fine. 

var request = new XMLHttpRequest(); 
request.open('PUT', dict.url, true); 
request.setRequestHeader('Content-Type', 'application/json;charset=UTF-16'); 
request.setRequestHeader('X-User-Token', dict.token); 
request.setRequestHeader("Content-length", data.length); 

request.send(dict.data); 

Если я console.log данные JSON, данные по всей длине, но если я смотрю на просьбу под mitmproxy, он отрезан как таковой:

{"id":"messageid-123456","time":"2015-05-29T03:43:17.566Z","layout":{"type":"message","title":"\"......\"","body":"\"......\"","largeIcon":"http://site/icons/icon.png","foregroundColor":"#445566","backgroundColor":"#222222"},"createNotification":{"layout":{"type":"genericNotification""title":"\"......\"","subtitle":"\"......\"","largeIcon":"http://site/icons/ic 

ответ

1
request.setRequestHeader('Content-Type', 'application/json;charset=UTF-16'); 

Для типа application/json нет параметра charset. Если бы это было, UTF-16 был бы неправильным выбором. Когда XMLHttpRequest отправляет JS String, он кодирует его как UTF-8.

request.setRequestHeader("Content-length", data.length); 

Это ничего не значит. XMLHttpRequest всегда заполняет Content-Length из длины отправляемых данных и игнорирует этот вызов. Если это не так, data.length будет неправильным значением, потому что это длина в кодовых единицах UTF-16, но Content-Length измеряется в байтах.

, если я смотрю на просьбу под mitmproxy, он отрезан как таковой:

Это, казалось бы, проблема с пользовательским интерфейсом mitmproxy в.

"title":"\"......\"" 

U + 2764, U + FE0F будет закодирован в UTF-8, как байты 0xE2,0x9D, 0xA4,0xEF, 0xB8,0x8F. mitmproxy отображает только данные потока ASCII, не пытаясь декодировать их как любую другую кодировку, поэтому он отображает каждый байт с установленным битом в качестве заполнителя ..

+0

> Это может показаться проблемой с пользовательским интерфейсом пользователя mitmproxy. Если я посмотрю данные с флягой, он обрезается в том же месте. '{" id ":" messageid-123456 "," time ":" 2015-05-29T13: 34: 19.357Z "," layout ": {" type ":" message "," title ":" \ "❤️ \" " "тело": "\" ❤️ \ "", "largeIcon": "HTTP: //site/icons/icon.png", "ForegroundColor": "# 445566"," BackgroundColor ":" # 222222 "}," createNotification ": {" раскладка ": {" типа ":" genericNotification " "название": "\" ❤️ \ "", "подзаголовок": "\" ❤️ \" »,« largeIcon »:« http: // site/icons/ic' – exiva

+0

Является ли код точным? Что такое 'dict.data'? Я предполагал, что это была ошибка, и вы хотели отправить' jsonenc'. – bobince

Смежные вопросы