在包含反斜杠的字符串中转义反斜杠

Escaping backslash in a string containing backslash

我有一个包含 I\u2019m 的字符串(反斜杠未转义)

var myString = 'I\u2019m'; // I\u2019m

但是我需要一个 'escape backslashes' 那个字符串的函数,所以我正在寻找的函数将 return 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

decodeURIComponent(JSON.parse('"I\u2019m"')); 

或多个

'I\\u2019m'.split('\').join().replace(/,/g,'');
'I\u2019m'.split('\').join().replace(/,/g,'');

这里的反斜杠不是真正的问题 - 真正的问题是 codedata.[=22= 之间的区别]

\uXXXX 是 JavaScript 语法,用于在文本文字中写入字符的 Unicode 代码点。当 JavaScript 解析器解释此 code.

时,它会被替换为实际字符

现在您有一个已经包含值 I\u2019m 的变量 - 即 data。这不会被解析为 JavaScript,因此它确实表示文字字符 I\u2019m,而不是 I’meval 可以“修复”这个问题,因为缺少的将其解释为代码的步骤正是 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 想要后者。

看起来除了 eval 别无他法(JSON.parse 不喜欢字符串中的新行)
注意:如果函数有尾部反斜杠

,则该函数将 return 为 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;
    }
}