0

我有一个网站,我使用了 AJAX。我遇到了一些问题。

服务器返回类似这样的 JSON 字符串{a:"x48\x65\x6C\x6C\x6F"}

然后在xx.responseText,我们有这个字符串'{a:"\x48\x65\x6C\x6C\x6F"}'

但是,如果我创建 JavaScript 字符串"\x48\x65\x6C\x6C\x6F",那么我有"Hello"而不是十六进制!

是否有可能xx.responseText从 HEX 获取“真实”文本(自动,没有.replace())?

4

2 回答 2

2

如果输出完全正常(可预测),.replace()可能是最简单的。

var escapeSequences = xx.responseText.replace(/^\{a:/, '').replace(/\}$/, '');

console.log(escapeSequences === "\"\\x48\\x65\\x6C\\x6C\\x6F\""); // true

或者,如果一个值相等但可能不相同的字符串文字就足够了,您可以解析(见下文),然后解析stringify()一个单独的属性。

console.log(JSON.stringify(data.a) === "\"Hello\""); // true

否则,您可能需要responseText通过词法分析器对其进行标记并从中检索文字。JavaScript 不包含与解析/评估分开的选项,因此您需要为此找到一个库。

用 JavaScript 编写的 Lexer? ” 可能是一个很好的起点。


解析它:

由于它似乎是一串代码,因此您可能必须使用eval().

var data = eval('(' + xx.responseText + ')');

console.log(data.a); // Hello

注意:括号确保{...}被评估为Object文字而不是


另外,我建议寻找替代代码来传递这样的数据。

一个常见的选项是JSON,它的语法来自 JavaScript,但使用了一个相当严格的子集。它不允许function包含 s 或其他可能有问题的代码。

var data = JSON.parse(xx.responseText);

console.log(data.a); // Hello

访问JSON.org,您应该能够找到用于选择服务器端语言以输出 JSON 的参考或库。

{ "a": "Hello" }
于 2013-09-12T17:53:54.610 回答
1

为什么不让 JSON 解析器完成它的工作并处理\x转义序列,然后再将字符串转换回十六进制,例如

function charToHex(c) {
    var hex = c.charCodeAt(0).toString(16);
    return (hex.length === 2) ? hex : '0' + hex;
}

"Hello".replace(/./g, charToHex);  // gives "48656c6c6f"
于 2013-09-12T19:19:34.930 回答