Как декодировать строку с помощью экранированного unicode?

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

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

var s = 'httpu00253Au00252Fu00252Fexample.com';

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

5 ответов


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

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

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

изменить (2017-10-12):

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

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

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


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

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. Эта изолированная часть называется группой.

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

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

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


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

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

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

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