Обратная косая черта здесь не является реальной проблемой - настоящая проблема заключается в разнице между кодом и данными .
\uXXXX
- это синтаксис JavaScript для записикод Unicode символа в текстовом литерале.Он заменяется реальным символом, когда синтаксический анализатор JavaScript интерпретирует этот код .
Теперь у вас есть переменная, которая уже содержит значение I\u2019m
- это data .Это не анализируется как JavaScript, поэтому оно означает буквальные символы I\u2019m
, а не I’m
.eval
может «исправить» это, потому что пропущенный шаг интерпретации этого как кода - это просто то, что делает eval .
Если вы не хотите использовать eval (и тем самым приглашаете всехпотенциальные риски, которые влекут за собой, если входные данные не полностью находятся под вашим контролем), тогда вы можете анализировать эти числовые значения из строки с помощью регулярных выражений, а затем использовать String.formCharCode
для создания фактического символа Юникода из заданной кодовой точки:
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
.