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)

  • а результаты разные???

P.S. Единственная разница, которую я вижу, заключается в происхождении переменных content и string. Но играет ли это роль?


person Oleksii Shnyra    schedule 16.05.2016    source источник


Ответы (1)


Вторая созданная вами строка не является строкой символов с обратной косой чертой внутри нее. Скорее, это строка символов Юникода. При создании строки в javascript вы можете использовать обратную косую черту и указать номер символа Unicode. Это позволяет использовать специальные символы, которые находятся за пределами обычных клавиш, допускающих набор текста. (Не совсем точно, но вы поняли идею).

Чтобы заставить это работать, вам нужно сделать следующее:

var string = '\\u0430\\u0437\\u0443\\u0439';

Этот двойной escape означает, что у вас есть обратная косая черта вместо escape-последовательности.

См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#String_literals для более подробной информации.

Изменить: похоже, вы спрашиваете, как перейти от первой строки к фактическим символам Юникода. Используйте это (ответ возьмите из Как декодировать строку с экранированными Юникод?):

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);
person Michael Ambrose    schedule 16.05.2016