使用unicode时,XMLHttpRequest正文被切断

时间:2015-05-29 04:32:32

标签: javascript json unicode xmlhttprequest

我在使用XMLHttpRequest时遇到问题,在身体中使用表情符号时会切断json编码信息的正文。

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 个答案:

答案 0 :(得分:1)

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

charset媒体类型没有application/json参数。如果有,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流数据而不尝试解码任何其他编码,因此它将每个顶部位设置的字节显示为占位符.