原始字符串到普通字符串 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));
普通字符串赋值:
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));