将字符串解释为转义字符串

Interpret string as escaped string

为什么这不起作用?

decodeURI('\n') => newline;
decodeURI("\n") => '\n', thus presumably...
decodeURI(decodeURI("\n")) // => gives '\n' instead of newline

但是这样可以吗?

JSON.parse('"\n"') // => newline

这里的重点是能够构建一个\*字符串,然后通过decodeURI将其转换为它的实际字符。

我想尽可能避免使用 JSON.parse。

编辑

我意识到我处理这个问题的方式令人困惑。一个更好的问题是询问 decodeURI 和 JSON.parse 如何将字符串文字转换为已解析的字符,以及是否有更直接的东西。

decodeURI('\n') => newline; thus presumably

在您的代码中,\n 是一个换行符 ,甚至在解码 URI 之前。反斜杠在 JavaScript.

中的字符串文字中有意义
decodeURI(decodeURI("\n")) // => gives '\n' instead of newline

在这个例子中,你用另一个反斜杠转义了反斜杠。因此,不是将换行符传递给 decodeURI(),而是传递反斜杠字符和 'n' 字符的文本。这些在 URI 中都没有特殊含义,因此 decodeURI() 的输出与其输入相同。做两次当然会产生零差异。我不太明白你的意思。

But this does?

JSON.parse('"\n"') // => newline

再次尝试解压它,这就是您在这里所做的。第一个反斜杠转义下一个反斜杠,在字符串中留下一个实际的反斜杠。所以,真正的字符串是"\n"。如果你 JSON.parse() 这个,解析器首先解释你正在处理一个字符串文字。然后,它将 \n 解码为换行符。这就是为什么它只输出一个换行符。

Point here is to be able to build a * character string, then convert it to its actual character via decodeURI.

decodeURI 与此完全无关。

这是有原因的:

decodeURI(decodeURI("\n"));

不提供换行符,但这样做:

JSON.parse('"\n"');

这是因为 \n 实际上不是 URI 组件(如果换行符是 URI 编码的,它看起来像 %0A 而不是 \n),也因为它实际上是逃脱了。

这里有一些演示:


演示 1:decodeURI("\n")

var newline = decodeURI("\n");
console.log("Line One" + newline + "Line Two");

你可以在上面看到控制台中有一个换行符,在Line OneLine Two之间。


演示 2:decodeURI(decodeURI("\n"))

var newline = decodeURI(decodeURI("\n"));
console.log("Line One" + newline + "Line Two");

这里,我们可以看到解码后的转义换行符(\n)只是一个换行符串——newline字面意思就是字符串"\n",不是换行符。我们可以在下一个演示中看到这一点的证明:


演示 3:typeof decodeURI("\n")

var newline = decodeURI("\n");
console.log("Line One" + newline + "Line Two");
console.log(typeof newline);

这里我们看到 decodeURI("\n") returns 只是一个字符串 \n,由于未知原因无法使用 decodeURI 两次进行解码,如您所见这里:


演示 4:decodeURI(decodeURI("\n"))

var newline = decodeURI("\n");
var temp = decodeURI(newline);
console.log("Line One" + newline + "Line Two");
newline = temp;
console.log("Line One" + newline + "Line Two");

在这里我们可以看到 newlinetemp 几乎是一回事——字符串 "\n".


这段代码是有原因的:

decodeURI("\n");

其实returns也是一个换行符——因为在使用decodeURI之前,"\n"已经是一个换行符,所以decodeURI是多余的。看到这个:

var newlineString = "\n";
var newline = decodeURI(newlineString);
console.log("Line One" + newlineString + "Line Two");
console.log("Line One" + newline + "Line Two");

这里,两行由换行符分隔,这意味着 "\n" 实际上根本没有被解码 - 你根本不需要 decodeURI


希望对您有所帮助!


延伸阅读: