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

时间:2018-06-04 07:06:06

标签: javascript string encoding decoding

正常字符串赋值:

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

原始字符串赋值:

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

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

2 个答案:

答案 0 :(得分:0)

问题是,这段代码是八进制的,并且由于它们是用语言符号映射的,因此javascript在定义新字符串时会对其进行解释。 你可以做的是用你的密钥作为实际的字符串和值作为实际符号来制作你需要的所有符号的地图。

代表前 -

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

console.log(map);

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

 var str2 = String.raw`\320`;
 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;
 }

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

答案 1 :(得分:0)

问题已经存在了几个月,但是我认为这个答案是您最好的选择。使用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“星体” unicode十六进制和代理对。 (八进制除外,因为它们已过时,但您始终可以将其添加回去)。下一步是编写一个函数,该函数可以用相应的符号替换代码点。首先为单身人士提供类似开关的功能:

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

然后,我们可以依靠ES6 fromcodepoint来处理其余的都是十六进制的内容。

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));