Ошибка Javascript с двойным экранированием Unicode

У меня проблема с отображением строки Javascript со встроенными escape-последовательностями символов Unicode (\ uXXXX), где начальный символ «\» сам экранирован как «& # 92;» Что мне нужно сделать, чтобы преобразовать строку, чтобы она правильно оценивала управляющие последовательности и выдавала на выходе правильный символ Юникода?

Например, я имею дело с вводом, таким как:

"this is a \u201ctest\u201d";

пытается расшифровать "& # 92;" используя выражение регулярного выражения, например:

var out  = text.replace('/\/g','\');

приводит к выходному тексту:

"this is a \u201ctest\u201d";

то есть escape-последовательности Unicode отображаются как фактические escape-последовательности, а не как символы двойных кавычек, которые мне бы хотелось.

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
9
0
6 640
5

Ответы 5

Я не уверен, так ли это, но ответ может иметь какое-то отношение к eval (), если вы можете доверять своему вводу.

Я думал в том же духе, но использование eval () во всех возможных вариантах приводило к такому же экранированному выводу; например.,

eval(new String("this is a \u201ctestamp;92;u201d"));

или даже

eval(new String("this is a \u201ctestamp;92;u201d".replace('/&amp#92;/g','\')));

все результаты в одном и том же:

"this is a \u201ctest\u201d";

Как будто мне нужно заставить движок Javascript каким-то образом переоценить или повторно проанализировать строку, но я не знаю, что бы это сделал. Я подумал, что, возможно, это сделает eval () или просто создание новой строки с использованием правильно экранированного ввода, но теперь удачи.

Основной вопрос - что мне нужно сделать, чтобы перевернуть данную строку:

"this is a \u201ctestamp;92;u201d"

в строку, в которой используются правильные символы Юникода?

Как оказалось, нам нужен unescape (), но с '% uXXXX', а не '\ uXXXX':

unescape (yourteststringhere.replace (/ & # 92; / g, '%'))

Я не думаю, что в целом это сработает; unescape предназначен для URL-адресов, которые не обрабатывают многобайтовые символы Unicode.

JW. 08.11.2008 22:07

Разве наличие 4 X не говорит о многобайтовости? ;) В любом случае у меня это работает в FF3: var yourteststringhere = "Ein sch & # 92; u00F6nes Beispiel eines mehrsprachigen Textes: & # 92; u65E5 & # 92; u672C & # 92; u8A9E";

Kev 08.11.2008 22:20

Я исправился. Думал, вы использовали% XX, а не% uXX.

JW. 09.11.2008 02:56

escape / unescape на самом деле представляет собой свое собственное странное животное, которое ведет себя иначе, чем кодировка URL (encodeURIComponent) или любая другая стандартная схема кодирования для Интернета. Преобразование% uXXXX для не-Latin-1 было введено IE и сейчас поддерживается большинством браузеров, но до сих пор надежно не задокументировано.

bobince 09.11.2008 04:49

... тем не менее, на практике вам, вероятно, удастся избежать неприятностей, если в строке нет других знаков процента.

bobince 09.11.2008 04:54

Недокументированный, но невероятно полезный. Сочетание замены регулярного выражения HTML-сущностей и отмены экранирования символов, отличных от Latin-1, позволяет избежать eval и открывает дополнительные параметры форматирования строк.

Paul Sweatte 29.08.2012 03:35

Это ужасное решение, но вы можете сделать это:

var x = "this is a \u201ctest\u201d".replace(/\/g,'\\')
// x is now "this is a \u201ctest\u201d"
eval('x = "' + x + '"')
// x is now "this is a “test”"

Это ужасно, потому что:

  • eval может быть опасным, если вы не знаете, что находится в строке

  • цитирование строки в операторе eval будет прервано, если в вашей строке есть настоящие кавычки

Я бы по-прежнему не рекомендовал этот подход, но вы можете сделать его более безопасным следующим образом: eval('x = "' + x.replace(/\/g,'\\').replace(/([^\\])"/g, '$1\\"') + '"')

Kip 25.07.2011 20:05

подождите, это еще может сломаться по-другому. ты прав, это ужасное решение. все равно ставлю +1, потому что вы четко объясняете, что это ужасное решение, и объясняете, почему.

Kip 25.07.2011 20:06

Вы уверены, что "\" - единственный символ, который может быть экранирован с помощью HTML? Вы уверены, что '\ uXXXX' - единственный используемый вид экранирования строки?

Если нет, вам понадобится универсальный декодер HTML-символа / ссылки на сущность и декодер-строкового литерала JS. К сожалению, в JavaScript нет для этого встроенных методов, и делать это вручную с загрузкой регулярных выражений довольно утомительно.

Можно воспользоваться преимуществами HTML-декодера браузера, присвоив строку свойству innerHTML элемента, а затем попросив JavaScript декодировать строку, как указано выше:

var el= document.createElement('div');
el.innerHTML= s;
return eval('"'+el.firstChild.data+'"');

Однако это невероятно уродливый взлом и дыра в безопасности, если строка исходит из источника, которому не доверяют на 100%.

Откуда берутся струны? Было бы лучше, если бы возможно было решить проблему на стороне сервера, где у вас могут быть доступны более мощные функции обработки текста. И если бы вы могли исправить все, что является ненужным HTML-экранированием ваших обратных косых черт, вы могли бы обнаружить, что проблема устранена сама собой.

Другие вопросы по теме