decodeURIComponent одновременно работает и не работает?
Я просто не могу этого понять, но вот моя ситуация.
У меня есть этот код:
someFunction: function(content){
content = content.substr(19005,24);
console.log('content is: '+content);
content = decodeURIComponent(content);
console.log(typeof content, content);
var string = '\u0430\u0437\u0443\u0439';
string = decodeURIComponent(string);
console.log(typeof string, string);
}
И когда я запускаю это на моем сервере node.js, он возвращает этот "ненормальный" результат:
content is: \u0430\u0437\u0443\u0439
string \u0430\u0437\u0443\u0439 // but should be "string азуй" as below
string азуй
Итак, как это на самом деле возможно??
1) Тот же контент
2) тот же тип переменной
3) Та же (decodeURIComponent) функция
- но разные результаты???
PS Единственное отличие я вижу в происхождении content
а также string
вары. Но играет ли это роль?
1 ответ
Вторая созданная вами строка не является строкой символов с обратной косой чертой внутри. Скорее, это строка символов Юникода. При создании строки в javascript вы можете использовать обратную косую черту и указать номер символа Юникода. Это учитывает специальные символы, которые находятся за пределами обычных печатаемых клавиш. (Не совсем точно, но вы поняли).
Чтобы заставить это работать, вам нужно сделать это:
var string = '\\u0430\\u0437\\u0443\\u0439';
Этот двойной побег означает, что у вас есть обратная косая черта вместо escape-последовательности.
См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar для получения дополнительной информации.
Изменить: Похоже, вы спрашиваете, как перейти от первой строки к фактическим Unicode символов. Используйте это (ответ взять из Как я декодирую строку с экранированным Unicode?):
var content = content.substr(19005,24);
var r = /\\u([\d\w]{4})/gi;
content = content.replace(r, function (match, grp) {
return String.fromCharCode(parseInt(grp, 16)); } );
content = unescape(content);