HTTP POST响应在字母之间返回'\ u0'字符,如何在JavaScript中删除它们或解析它们?

时间:2013-11-21 23:32:13

标签: javascript regex dll unicode httpresponse

标题几乎说明了一切。

我正在向提供给我的.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"
      }
    ]
  }
}

1 个答案:

答案 0 :(得分:2)

这听起来像是一个字符编码问题。 UTF-16编码(以及其他16位字符集)将使用额外的字节,对于您看到的大多数西方字符,它将是0x00

你可能会和JavaScript一起破解这个。但是,根据数据的格式,您可以指定正确的字符集,浏览器可能会为您处理。如果没有,您可以随时编写代理请求的服务器端代码,并在将响应数据发送到客户端之前修改响应数据。