Как декодировать строку с экранированным юникодом?


Я не уверен, что это называется, поэтому у меня возникли проблемы с его поиском. Как я могу декодировать строку с unicode из httpu00253Au00252Fu00252Fexample.com to http://example.com С помощью JavaScript? Я пытался unescape,decodeURI и decodeURIComponent так что я думаю, что единственное, что осталось, это строка заменить.

EDIT: строка не набирается, а скорее подстрока из другого фрагмента кода. Поэтому, чтобы решить проблему, вы должны начать с чего-то вроде этого:

var s = 'httpu00253Au00252Fu00252Fexample.com';

Я надеюсь, что это показывает, почему unescape() не делает работа.

5 70

5 ответов:

оригинальный ответ:

unescape(JSON.parse('"http\u00253A\u00252F\u00252Fexample.com"'));
> 'http://example.com'

вы можете разгрузить всю работу в JSON.parse

Edit (2017-10-12):

@MechaLynx и @Kevin-Weber отмечают, что unescape() является устаревшим из не-браузерных сред и не существует в TypeScript. decodeURIComponent это капля в замене. Для более широкой совместимости, используйте вместо этого:

decodeURIComponent(JSON.parse('"http\u00253A\u00252F\u00252Fexample.com"'));
> 'http://example.com'

обновление: обратите внимание, что это решение, которое должно применяться к старым браузерам или не-браузерным платформам, и поддерживается в учебных целях. Пожалуйста, обратитесь к ответу @radicand ниже для более современного ответа.


это Юникод, экранированная строка. Сначала строка была экранирована, а затем закодирована с помощью Юникода. Чтобы преобразовать обратно в нормальный:

var x = "http\u00253A\u00252F\u00252Fexample.com";
var r = /\u([\d\w]{4})/gi;
x = x.replace(r, function (match, grp) {
    return String.fromCharCode(parseInt(grp, 16)); } );
console.log(x);  // http%3A%2F%2Fexample.com
x = unescape(x);
console.log(x);  // http://example.com

чтобы объяснить: я использую регулярное выражение для поиска \u0025. Однако, поскольку Мне нужна только часть этой строки для моей операции замены, я использую круглые скобки, чтобы изолировать часть, которую я собираюсь повторно использовать,0025. Эта изолированная часть называется группой.

The gi часть в конце выражения обозначает, что она должна соответствовать всем экземплярам в строке, а не только первому, и что соответствие должно быть нечувствительным к регистру. Это может показаться ненужным, учитывая пример, но он добавляет универсальность.

теперь, чтобы преобразовать из одной строки в другую, мне нужно чтобы выполнить некоторые шаги на каждой группе каждого матча, и я не могу сделать это, просто Преобразуя строку. Услужливо, строка.операция замены может принимать функцию, которая будет выполняться для каждого матча. Возврат этой функции заменит само совпадение в строке.

я использую второй параметр, который принимает эта функция, который является группой, которую мне нужно использовать, и преобразую его в эквивалентную последовательность utf-8, а затем используйте встроенный unescape функция для декодирования строки к своей правильной форме.

обратите внимание, что использование unescape() и устаревший и не работает с компилятором TypeScript, например.

исходя из ответа выражение квадратный корень из числа, а в разделе комментарии ниже, Вот обновленное решение:

var string = "http\u00253A\u00252F\u00252Fexample.com";
decodeURIComponent(JSON.parse('"' + string.replace(/\"/g, '\"') + '"'));

http://example.com

взгляните на эту страницу: http://www.rishida.net/tools/conversion/

вставьте код в верхнее текстовое поле (сначала удалите двойные косые черты).

код с открытым исходным кодом:http://www.rishida.net/tools/conversion/conversionfunctions.js

у меня недостаточно репутации, чтобы поместить это в комментарии к существующим ответам:

unescape является только устаревшим для работы с URI (или любым закодированным utf-8), что, вероятно, относится к потребностям большинства людей. encodeURIComponent преобразует строку js в Escape UTF-8 и decodeURIComponent работает только на экранированных UTF-8 байт. Он выдает ошибку для чего-то вроде decodeURIComponent('%a9'); // error потому что расширенный ascii не является допустимым utf-8 (хотя это все еще значение unicode), тогда как unescape('%a9'); // © так что вам нужно знать ваш данные при использовании декодирующего компонента.

decodeURIComponent не будет работать на "%C2" или любой одинокий байт над 0x7f потому что в utf-8 это указывает на часть суррогата. Однако decodeURIComponent("%C2%A9") //gives you © Unescape не будет работать должным образом на этом // © и это не вызовет ошибку, поэтому unescape может привести к ошибочному коду, если вы не знаете свои данные.