标题几乎说明了一切。
我正在向提供给我的.dll发送HTTP POST。响应文本包含我需要以人类可读的方式解析和显示给用户的信息。我知道响应,但我的JavaScript告诉我响应不匹配,但当我查看响应文本时,它显然完全相同。
好吧,当我仔细观察并使用Chrome的开发工具查看响应时,它会显示每个字母后都有'\ u0'个字符。它是角色的结尾,还是每个角色的某种终止标记?
我的第一个猜测是它是一个字符编码问题,但我不太确定。
有人能告诉我实际发生了什么吗?如何替换这些字符,以便检查响应中的子字符串?
这是来自一家名为Magic Software的公司的IIS 7提供的.dll的AJAX POST请求。
以下是回复:
HTTP/1.1 500 Internal Server Error
Cache-Control: private
Content-Type: text/html
Server: Microsoft-IIS/7.5
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Thu, 21 Nov 2013 23:51:46 GMT
Content-Length: 60
<h1>Max instance reached.</h1>
修改
我使用以下函数将我收到的UTF-16字符串转换为UTF-8。它适用于我的目的。我从两个不同的来源拼凑了它:
http://jonisalonen.com/2012/from-utf-16-to-utf-8-in-javascript/
Convert integer array to string at javascript
我应该对字符编码有更好的了解,而且我没有太多地了解它在一起做什么。我打算做一些阅读。 :P
有人可以查看这个并告诉我它是否是一个合适的解决方案吗?
function UTF16toUTF8Str(str) {
var utf8 = [];
for (var i = 0; i < str.length; i++) {
var charcode = str.charCodeAt(i);
if (charcode < 0x80) utf8.push(charcode);
else if (charcode < 0x800) {
utf8.push(0xc0 | (charcode >> 6),
0x80 | (charcode & 0x3f));
}
else if (charcode < 0xd800 || charcode >= 0xe000) {
utf8.push(0xe0 | (charcode >> 12),
0x80 | ((charcode >> 6) & 0x3f),
0x80 | (charcode & 0x3f));
}
// surrogate pair
else {
i++;
// UTF-16 encodes 0x10000-0x10FFFF by
// subtracting 0x10000 and splitting the
// 20 bits of 0x0-0xFFFFF into two halves
charcode = 0x10000 + (((charcode & 0x3ff) << 10)
| (str.charCodeAt(i) & 0x3ff))
utf8.push(0xf0 | (charcode >> 18),
0x80 | ((charcode >> 12) & 0x3f),
0x80 | ((charcode >> 6) & 0x3f),
0x80 | (charcode & 0x3f));
}
}
var i, str = '';
for (i = 0; i < utf8.length; i++) {
if (utf8[i] !== 0) str += '%' + ('0' + utf8[i].toString(16)).slice(-2); // only add non-null characters to the string
}
str = decodeURIComponent(str);
return str;
}
修改
以下是我从Chrome的开发工具获得的HAR文件的响应:
"response": {
"status": 500,
"statusText": "Internal Server Error",
"httpVersion": "HTTP/1.1",
"headers": [
{
"name": "Date",
"value": "Fri, 22 Nov 2013 03:35:59 GMT"
},
{
"name": "Cache-Control",
"value": "private"
},
{
"name": "Server",
"value": "Microsoft-IIS/7.5"
},
{
"name": "X-AspNet-Version",
"value": "4.0.30319"
},
{
"name": "X-Powered-By",
"value": "ASP.NET"
},
{
"name": "Content-Length",
"value": "60"
},
{
"name": "Content-Type",
"value": "text/html"
}
],
"cookies": [],
"content": {
"size": 60,
"mimeType": "text/html",
"compression": 0,
"text": "<\u0000h\u00001\u0000>\u0000M\u0000a\u0000x\u0000 \u0000i\u0000n\u0000s\u0000t\u0000a\u0000n\u0000c\u0000e\u0000 \u0000r\u0000e\u0000a\u0000c\u0000h\u0000e\u0000d\u0000.\u0000<\u0000/\u0000h\u00001\u0000>\u0000"
},
"redirectURL": "",
"headersSize": 223,
"bodySize": 60
},
"cache": {},
"timings": {
"blocked": 0,
"dns": -1,
"connect": -1,
"send": 0,
"wait": 475.0000000349246,
"receive": 1.500034297350794,
"ssl": -1
},
"connection": "21740",
"pageref": "page_127"
}
]
}
}
答案 0 :(得分:2)
这听起来像是一个字符编码问题。 UTF-16编码(以及其他16位字符集)将使用额外的字节,对于您看到的大多数西方字符,它将是0x00
。
你可能会和JavaScript一起破解这个。但是,根据数据的格式,您可以指定正确的字符集,浏览器可能会为您处理。如果没有,您可以随时编写代理请求的服务器端代码,并在将响应数据发送到客户端之前修改响应数据。