Javascript с двойным выходом Unicode - PullRequest
9 голосов
/ 08 ноября 2008

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

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

"this is a \u201ctest\u201d";

пытается расшифровать "\" с помощью выражения регулярного выражения, например ::10000 *

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

приводит к выводу текста:

"this is a \u201ctest\u201d";

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

Ответы [ 5 ]

6 голосов
/ 08 ноября 2008

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

экранирования в (yourteststringhere.replace (/ \ / г, '%'))

1 голос
/ 09 ноября 2008

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

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

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

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

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

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

1 голос
/ 08 ноября 2008

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

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 прервется, если в вашей строке будут кавычки

0 голосов
/ 08 ноября 2008

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

eval(new String("this is a \u201ctest&#amp;92;u201d"));

или даже

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

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

"this is a \u201ctest\u201d";

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

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

"this is a \u201ctest&#amp;92;u201d"

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

0 голосов
/ 08 ноября 2008

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

...