我有一个包含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
反斜杠不是真正的问题 - 真正的问题是代码和数据之间的区别。
\uXXXX
是JavaScript语法,用于在文本文字中编写字符的Unicode代码点。当JavaScript解析器解释此代码时,它将被实际字符替换。
现在你有一个包含值I\u2019m
的变量 - 即数据。这不会被解析为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
想要后者。
decodeURIComponent(JSON.parse('"I\\u2019m"'));
或多个
'I\\\u2019m'.split('\\').join().replace(/,/g,'');
'I\u2019m'.split('\\').join().replace(/,/g,'');
看起来除了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;
}
}