原始字符串到普通字符串 javascript

Raw String to normal string javascript

普通字符串赋值:

var str1 = "0";
console.log(str1);    //   "Ð"

原始字符串赋值:

var str2 = String.raw`0`;
console.log(str2);    //   "0"

在原始字符串中,不解释反斜杠。我需要解释它们,以便“\320”变成“Д。我是否必须将原始字符串转换为普通字符串。如果是这样,如何?如果不是这样,我还应该做什么以及我该怎么做?

问题是,这个代码是八进制的,并且由于这些是用语言符号映射的,javascript 在定义新字符串时解释它。 你可以做的是制作一个你需要的所有符号的映射,将它们的键作为实际字符串,将值作为实际符号。

前 -

var map = {
    "\320": "0"
}

console.log(map);

现在您可以在地图中搜索您的文本并获得所需的值。

 var str2 = String.raw`0`;
 var s = map[str2];
 console.log(s);

要制作地图,试试这个 - 访问此站点 - https://brajeshwar.github.io/entities/

和运行控制台上的此代码

 // for latin
 var tbody = document.getElementById("latin");
 var trs = tbody.children;
 var map = {};
 for(i=1;i<trs.length;i++) {
    console.log(trs[i].children[6].innerText);
    key = trs[i].children[6].innerText;
    value = trs[i].children[1].innerText;
    map[key] = value;
 }

现在控制台映射,对其进行字符串化,然后将字符串粘贴到您的代码中并进行解析。 我只对拉丁语做了这个,同样对其他元素也这样做了。

问题已经有几个月了,但我认为这个答案是你最好的选择。从原始字符串转换转义序列在 ES6 String.fromcodepoint(<hex-value>) 中非常可行。我正在编写一个 NPM 包来处理这个确切的场景。

首先,您需要一个匹配字符串中所有转义序列的正则表达式。我对所有不同的都使用了 this as a reference。 (我为此使用原始字符串以避免垃圾邮件反斜杠)

let [single, ...hex] = String.raw`
  \[bfnrtv0'"\]
  \x[a-fA-F0-9]{2}
 (\u[a-fA-F0-9]{4}){1,}
  \u\{([0-9a-fA-F]{1,})\}`
  .split("\n").slice(1).map(cur => cur.trim());

let escapes = new RegExp(`(${[single].concat(hex).join("|")})`, "gm"),

    // We need these for later when differentiating how we convert the different escapes.
    uniES6  = new RegExp(`${hex.pop()}`);
    single  = new RegExp(`${single}`);

现在你可以匹配所有的转义了;保留的单个字符、扩展的 ASCII 范围、ES6 "Astral" unicode 十六进制和代理项对。 (八进制除外,因为它们已被弃用,但您可以随时将其添加回来)。下一步是编写一个可以用相应符号替换代码点的函数。首先是单身人士的类似开关的功能:

const singleEscape = seq =>
  (() => ({
    "\b"  : "\b",
    "\f"  : "\f",
    "\n"  : "\n",
    "\r"  : "\r",
    "\t"  : "\t",
    "\v"  : "\v",
    "\0"  : "[=11=]",
    "\'"  : "\'",
    "\\"" : "\"",
    "\\" : "\"
  }[seq]))();

那我们就可以依靠ES6fromcodepoint来处理剩下的都是16进制了

const convertEscape = seq => {

  if (single.test(seq)) 
    return singleEscape(seq);

  else if (uniES6.test(seq))
    return String.fromCodePoint(`0x${seq.split("").slice(3, -1).join("")}`);

  else
    return String.fromCodePoint.apply(
      String, seq.split("\").slice(1).map(pt => `0x${pt.substr(1)}`)
    );

}

最后,我们将它们与名为 normal 标记模板文字函数 联系在一起。我不知道你为什么需要一个原始字符串,但在这里你可以访问原始字符串并放置任何额外的逻辑,同时仍然产生一个转义序列被正确解析的字符串。

const normal = (strings, ...values) => strings.raw
    .reduce((acc, cur, i) => acc += (values[i-1] || "") + cur, "")
    .replace(escapes, match => convertEscape(match));