【问题标题】:Interpret string as escaped string将字符串解释为转义字符串
【发布时间】:2019-05-18 07:09:36
【问题描述】:

为什么这不起作用?

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 如何将它们从字符串文字转换为已解析的字符,以及是否有更直接的方法。

【问题讨论】:

  • 因为\n不是URI编码。
  • @SLaks - 我添加了另一行进行澄清。
  • "如果可能,我想避免使用 JSON.parse。" - 但为什么呢?这是您需要的功能,它是有效的功能。
  • 编辑后,这个问题仍然没有任何意义。 URL 编码不涉及\*
  • 您应该从了解decodeURI 的作用开始。

标签: javascript escaping unicode-escapes


【解决方案1】:
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 与此完全无关。

【讨论】:

  • 我知道 decodeURI 不适合这个,我应该使用 JSON.parse。我基本上要求能够直接构建这些转义字符,而不需要解释它的 JSON.parse。
  • @Karric 为了再次强调我在回答中写的内容,换行符对decodeURI() 的意义为零。如果您想在decodeURI() 中添加一个换行符(并且您不应该),只需将一个换行符传入其中,就像您在示例代码的第一行中所做的那样。我建议在继续之前阅读 JavaScript 的一些基本语法并充分理解这一点。
【解决方案2】:

这是有原因的:

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


希望对您有所帮助!


进一步阅读:

【讨论】:

    猜你喜欢
    • 2013-09-27
    • 1970-01-01
    • 2023-03-11
    • 2012-07-10
    • 2020-12-15
    • 2013-05-26
    • 2010-12-09
    相关资源
    最近更新 更多