将字符串解释为转义字符串
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 One
和Line 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");
在这里我们可以看到 newline
和 temp
几乎是一回事——字符串 "\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
。
希望对您有所帮助!
延伸阅读:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURI
- Escaping backslash in string - javascript
- Escape new lines with JS
为什么这不起作用?
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 One
和Line 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");
在这里我们可以看到 newline
和 temp
几乎是一回事——字符串 "\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
。
希望对您有所帮助!
延伸阅读:
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURI
- Escaping backslash in string - javascript
- Escape new lines with JS