gpt4 book ai didi

javascript - JavaScript 中的“unraw”字符串

转载 作者:行者123 更新时间:2023-11-28 03:40:36 24 4
gpt4 key购买 nike

如何在 JavaScript 中获取原始字符串并将所有转义序列转换为各自的字符?换句话说,与String.raw相反。例如:

unraw("\\x61\\x62\\x63 \\u{1F4A9} \\u0041");
// => "abc 💩 A";

我尝试了 JSON.parse,但它只支持最后一种格式 (\\u0041)。 unescapedecodeURI 都不是我要找的。

最佳答案

我认为你基本上有三个选择:

  1. 编写自己的函数来执行此操作,处理 JavaScript 允许在字符串中进行的各种类型的转义;或
  2. 利用运行此代码的 JavaScript 引擎中内置的 JavaScript 解析器,这意味着信任字符串的内容,因为您必须使用 new Function (甚至是 eval) 这样做,这意味着让自己可以执行任意代码;或
  3. 使用类似 Esprima 的解析器或类似内容

#1 有点痛苦,但实际上并没有那么那么糟糕,没有那么多需要处理。 #2 存在有关信任字符串内容不是恶意代码的所有常见问题,因为使用 eval 或调用 new Function 创建的函数允许执行任意代码。 #3 是一个相当繁重的解决方案。

仔细看看#1,EscapeSequence分为:

  • 单字符转义,\ 后跟 '"\bfnrtv 之一。
  • 十六进制转义,\xHH,其中 H 是十六进制数字
  • Unicode 转义,\uHHHH\u{H+),其中 H 是十六进制数字

这实际上并没有那么糟糕。这是一个快速而肮脏的:

// Note: This does not implement LegacyOctalEscapeSequence (https://tc39.es/ecma262/#prod-annexB-LegacyOctalEscapeSequence)
function unraw(str) {
return str.replace(/\\[0-9]|\\['"\bfnrtv]|\\x[0-9a-f]{2}|\\u[0-9a-f]{4}|\\u\{[0-9a-f]+\}|\\./ig, match => {
switch (match[1]) {
case "'":
case "\"":
case "\\":
return match[1];
case "b":
return "\b";
case "f":
return "\f";
case "n":
return "\n";
case "r":
return "\r";
case "t":
return "\t";
case "v":
return "\v";
case "u":
if (match[2] === "{") {
return String.fromCodePoint(parseInt(match.substring(3), 16));
}
return String.fromCharCode(parseInt(match.substring(2), 16));
case "x":
return String.fromCharCode(parseInt(match.substring(2), 16));
case "0":
return "\0";
default: // E.g., "\q" === "q"
return match.substring(1);
}
});
}
console.log(String.raw`${unraw("\\x61\\x62\\x63 \\u{1F4A9} \\u0041")}`);
// Double-check result
const str = "\x61\x62\x63 \u{1F4A9} \u0041";
const raw = String.raw`\x61\x62\x63 \u{1F4A9} \u0041`;
console.log(str === unraw(raw));

我确信可以稍微清理一下。

关于javascript - JavaScript 中的“unraw”字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57330203/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com