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

时间:2018-12-17 21:36:54

标签: javascript escaping unicode-escapes

为什么不起作用?

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

但这是吗?

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

此处要点是能够构建\ *字符串,然后通过解码URI将其转换为实际字符。

如果可能的话,我想避免使用JSON.parse。

编辑

我意识到我的解决方法令人困惑。一个更好的问题是,要问decodeURI和JSON.parse如何将它们从字符串文字转换为解析的字符,以及是否还有更直接的东西。

2 个答案:

答案 0 :(得分:2)

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

在您的代码中,\n是换行符,甚至不可以解码URI 。反斜杠在JavaScript的字符串文字中具有含义。

decodeURI(decodeURI("\\n")) // => gives '\n' instead of newline

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

  

但这是吗?

     

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

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

  

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

decodeURI与此无关。

答案 1 :(得分:1)

这是有原因的:

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")仅返回字符串\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");

实际上也返回换行符-这是因为在使用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


希望这对您有所帮助!


进一步阅读: