У меня проблема с отображением строки Javascript со встроенными escape-последовательностями символов Unicode (\ uXXXX), где начальный символ «\» сам экранирован как «& # 92;» Что мне нужно сделать, чтобы преобразовать строку, чтобы она правильно оценивала управляющие последовательности и выдавала на выходе правильный символ Юникода?
Например, я имею дело с вводом, таким как:
"this is a \u201ctest\u201d";пытается расшифровать "& # 92;" используя выражение регулярного выражения, например:
var out = text.replace('/\/g','\');приводит к выходному тексту:
"this is a \u201ctest\u201d";то есть escape-последовательности Unicode отображаются как фактические escape-последовательности, а не как символы двойных кавычек, которые мне бы хотелось.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я не уверен, так ли это, но ответ может иметь какое-то отношение к eval (), если вы можете доверять своему вводу.
Я думал в том же духе, но использование eval () во всех возможных вариантах приводило к такому же экранированному выводу; например.,
eval(new String("this is a \u201ctestamp;92;u201d"));или даже
eval(new String("this is a \u201ctestamp;92;u201d".replace('/\/g','\')));все результаты в одном и том же:
"this is a \u201ctest\u201d";Как будто мне нужно заставить движок Javascript каким-то образом переоценить или повторно проанализировать строку, но я не знаю, что бы это сделал. Я подумал, что, возможно, это сделает eval () или просто создание новой строки с использованием правильно экранированного ввода, но теперь удачи.
Основной вопрос - что мне нужно сделать, чтобы перевернуть данную строку:
"this is a \u201ctestamp;92;u201d"в строку, в которой используются правильные символы Юникода?
Как оказалось, нам нужен unescape (), но с '% uXXXX', а не '\ uXXXX':
unescape (yourteststringhere.replace (/ & # 92; / g, '%'))
Разве наличие 4 X не говорит о многобайтовости? ;) В любом случае у меня это работает в FF3: var yourteststringhere = "Ein sch & # 92; u00F6nes Beispiel eines mehrsprachigen Textes: & # 92; u65E5 & # 92; u672C & # 92; u8A9E";
Я исправился. Думал, вы использовали% XX, а не% uXX.
escape / unescape на самом деле представляет собой свое собственное странное животное, которое ведет себя иначе, чем кодировка URL (encodeURIComponent) или любая другая стандартная схема кодирования для Интернета. Преобразование% uXXXX для не-Latin-1 было введено IE и сейчас поддерживается большинством браузеров, но до сих пор надежно не задокументировано.
... тем не менее, на практике вам, вероятно, удастся избежать неприятностей, если в строке нет других знаков процента.
Недокументированный, но невероятно полезный. Сочетание замены регулярного выражения HTML-сущностей и отмены экранирования символов, отличных от Latin-1, позволяет избежать eval и открывает дополнительные параметры форматирования строк.
Это ужасное решение, но вы можете сделать это:
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\\"') + '"')
подождите, это еще может сломаться по-другому. ты прав, это ужасное решение. все равно ставлю +1, потому что вы четко объясняете, что это ужасное решение, и объясняете, почему.
Вы уверены, что "\" - единственный символ, который может быть экранирован с помощью HTML? Вы уверены, что '\ uXXXX' - единственный используемый вид экранирования строки?
Если нет, вам понадобится универсальный декодер HTML-символа / ссылки на сущность и декодер-строкового литерала JS. К сожалению, в JavaScript нет для этого встроенных методов, и делать это вручную с загрузкой регулярных выражений довольно утомительно.
Можно воспользоваться преимуществами HTML-декодера браузера, присвоив строку свойству innerHTML элемента, а затем попросив JavaScript декодировать строку, как указано выше:
var el= document.createElement('div');
el.innerHTML= s;
return eval('"'+el.firstChild.data+'"');
Однако это невероятно уродливый взлом и дыра в безопасности, если строка исходит из источника, которому не доверяют на 100%.
Откуда берутся струны? Было бы лучше, если бы возможно было решить проблему на стороне сервера, где у вас могут быть доступны более мощные функции обработки текста. И если бы вы могли исправить все, что является ненужным HTML-экранированием ваших обратных косых черт, вы могли бы обнаружить, что проблема устранена сама собой.
Я не думаю, что в целом это сработает; unescape предназначен для URL-адресов, которые не обрабатывают многобайтовые символы Unicode.