我有一个包含I\u2019m
的字符串(没有反斜杠)
var myString = 'I\\u2019m'; // I\u2019m
但是随后我需要一个“转义反斜杠”该字符串的函数,因此我要查找的函数将返回I'm
backslashString(myString); // I'm
我尝试使用eval:
function backslashString(input){
input = input.replace(/'/g, "\\'"); // Replace ' with \' that's going to mess up eval
return eval(`'${input}'`);
}
但是有适当的方法吗?我正在寻找一个将包含I\u2019m
到I'm
的字符串转义反斜线的函数,并且还处理是否存在额外的反斜杠(A lost \ backslash
)
编辑:
我从一开始就没有问过我的意思。这不仅适用于unicode字符,还适用于所有反斜杠字符,包括\n
答案 0 :(得分:0)
decodeURIComponent(JSON.parse('"I\\u2019m"'));
或多个
'I\\\u2019m'.split('\\').join().replace(/,/g,'');
'I\u2019m'.split('\\').join().replace(/,/g,'');
答案 1 :(得分:0)
这里的反斜杠不是真正的问题-真正的问题是 code 和 data 之间的区别。
\uXXXX
是JavaScript语法,用于在文本文字中编写字符的Unicode代码点。当JavaScript解析器解释此 code 时,它将替换为实际字符。
现在您有了一个变量,该变量已经包含值I\u2019m
-即 data 。这不会被解析为JavaScript,因此它的确意味着文字字符I\u2019m
,而不是I’m
。 eval
可以“解决”这一问题,因为缺少将其解释为代码的步骤仅仅是eval 要做的。
如果您不想使用eval(因此,如果输入数据不受您的完全控制,则会引发所有潜在的风险),则可以使用正则表达式解析字符串中的那些数值,然后使用String.formCharCode
从给定的代码点创建实际的Unicode字符:
var myString = 'I\\u2019m and I\\u2018m';
var myNewString = myString.replace(/\\u([0-9]+)/g, function(m, n) {
return String.fromCharCode(parseInt(n, 16)) }
);
console.log(myNewString)
/\\u([0-9]+)/g
-匹配此\uXXXX
格式(X =数字)的正则表达式,g
修饰符替换所有匹配项,而不是在第一个匹配项后停止。
parseInt(n, 16)
-首先将十六进制值转换为十进制数,因为String.fromCharCode
想要后者。
答案 2 :(得分:0)
看起来除了eval之外别无其他方法(JSON.parse不喜欢字符串中的新行)
注意:如果该函数带有反斜杠,则会返回false
function backslashString(input){
input = input.replace(/`/g, '\\`'); // Escape quotes for input to eval
try{
return eval('`'+input+'`');
}catch(e){ // Will return false if input has errors in backslashing
return false;
}
}