Как декодировать строку с экранированным юникодом?
Я не уверен, что это называется, поэтому у меня возникли проблемы с его поиском. Как я могу декодировать строку с unicode из httpu00253Au00252Fu00252Fexample.com
to http://example.com
С помощью JavaScript? Я пытался unescape
,decodeURI
и decodeURIComponent
так что я думаю, что единственное, что осталось, это строка заменить.
EDIT: строка не набирается, а скорее подстрока из другого фрагмента кода. Поэтому, чтобы решить проблему, вы должны начать с чего-то вроде этого:
var s = 'httpu00253Au00252Fu00252Fexample.com';
Я надеюсь, что это показывает, почему unescape() не делает работа.
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 может привести к ошибочному коду, если вы не знаете свои данные.