Кодировать html-объекты в javascript


100

Я работаю в CMS, которая позволяет пользователям вводить контент. Проблема в том, что когда они добавляют символы ®, они могут плохо отображаться во всех браузерах. Я хотел бы создать список символов, которые необходимо найти, а затем преобразовать в соответствующий объект html. Например

® => ®
& => &
© => ©
™ =>™

После преобразования его нужно обернуть в <sup>тег, в результате чего получится :

® => <sup>&reg;</sup>

Поскольку необходим определенный размер шрифта и стиль заполнения:

sup { font-size: 0.6em; padding-top: 0.2em; }

Будет ли JavaScript что-то вроде этого?

var regs = document.querySelectorAll('®');
  for ( var i = 0, l = imgs.length; i < l; ++i ) {
  var [?] = regs[i];
  var [?] = document.createElement('sup');
  img.parentNode.insertBefore([?]);
  div.appendChild([?]);
}

Где «[?]» Означает, что есть что-то, в чем я не уверен.

Дополнительные детали:

  • Я бы хотел сделать это на чистом JavaScript, а не на том, что требует библиотеки вроде jQuery, спасибо.
  • Бэкэнд - это Ruby
  • Использование RefineryCMS, созданного на Ruby on Rails

Какой у вас бэкэнд? Если это php, есть функции, которые позаботятся об этом за вас, и я уверен, что они есть и в других языках. Кроме того, Google: developwithstyle.com/articles/2010/06/29/…
Крис Бейкер

5
Лучшим решением может быть принятие и вывод текста в кодировке UTF-8. Каждый используемый сегодня браузер поддерживает UTF-8. Со стороны HTML вы хотите добавить accept-charset="UTF-8"в свой <form>тег. На сервере вы хотите убедиться, что ваш вывод закодирован в UTF-8, и что ваш веб-сервер сообщает браузеру, что это так (через Content-Typeзаголовок). См. Rentzsch.tumblr.com/post/9133498042/… Если вы все это сделаете, а браузер не отображает символ правильно, то замена символа сущностью не будет иметь никакого значения.
Пол Д. Уэйт,

@Chris работает в CMS, построенной на Ruby on Rails.
JGallardo

Неправильно изменять символ на ссылку на HTML-сущность в клиентском JavaScript, поскольку клиентский JavaScript работает в DOM, где сущности не существуют. Заключение «®» в supэлементы обычно вызывает больше проблем, чем может решить, поскольку во многих шрифтах «®» имеет маленький размер и находится в нижнем индексе, поэтому вы уменьшите его до неузнаваемости.
Юкка К. Корпела

@ JukkaK.Korpela, поэтому, учитывая, что мне нужно решить, что некоторые HTML-объекты не будут отображаться должным образом, как бы вы это сделали? И обертывание <sup>не является проблемой, так как я тестировал определенные шрифты, используемые для сообщений в блоге, но это хороший момент, который следует учитывать.
JGallardo

Ответы:


176

Вы можете использовать регулярное выражение для замены любого символа в заданном диапазоне Unicode его эквивалентом сущности html. Код будет выглядеть примерно так:

var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/g, function(i) {
   return '&#'+i.charCodeAt(0)+';';
});

Этот код будет заменить все символы в заданном диапазоне (Юникод 00A0 - 9999, а также амперсанд, больше и меньше) с их эквивалентами сущностей HTML, который просто &#nnn;где nnnэто значение Юникода мы получаем изcharCodeAt .

Посмотрите здесь в действии: http://jsfiddle.net/E3EqX/13/ (в этом примере используется jQuery для селекторов элементов, используемых в примере. Сам базовый код, приведенный выше, не использует jQuery)

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

Документация


Большое спасибо за jsfiddle. Итак, чтобы реализовать это. Я могу просто добавить это в свой .jsфайл и добавить другие элементы, которые нужно обернуть с помощью <sup>?
JGallardo

2
@JGallardo Я немного переписал пример, поэтому он добавляет supтег (или любой другой тег), и он содержится в функции: jsfiddle.net/E3EqX/4 . Чтобы использовать это, вам нужно скопировать функцию encodeAndWrap в свой проект.
Крис Бейкер

1
@Chris благодарит за аккуратный фрагмент кода, хотя в нем есть одна ошибка: «[\ u00A0- \ u99999]» не делает то, что вы ожидаете, а скорее равно «[\ u00A0- \ u9999] | 9 "- т.е. символ «9» также ошибочно заменяется объектом HTML. Вы также можете попробовать это на скрипке. Я предлагаю исправление для ответа.
SB

@SB Спасибо за эту заметку, мне даже пришлось отдать последнее одобрительное голосование :)
Крис Бейкер,

1
Хотя я согласен с тем, что ответ @mathias Bynens более полный, его решение составляет 84 КБ, и это заставило меня продолжить поиск альтернативного. Это кажется нормальным, но можно ли также включить charCodes <65 и между> 90 && <97?
Флориан Мертенс

62

В принятом на данный момент ответе есть несколько проблем. Этот пост объясняет их и предлагает более надежное решение. Решение, предложенное в этом ответе, ранее имело:

var encodedStr = rawStr.replace(/[\u00A0-\u9999<>\&]/gim, function(i) {
  return '&#' + i.charCodeAt(0) + ';';
});

Этот iфлаг является избыточным, поскольку ни один символ Юникода в диапазоне от U + 00A0 до U + 9999 не имеет варианта верхнего / нижнего регистра, выходящего за пределы того же диапазона.

mФлаг является излишним , поскольку ^или$ не используется в регулярном выражении.

Почему диапазон от U + 00A0 до U + 9999? Это кажется произвольным.

В любом случае, для решения, которое правильно кодирует все, кроме безопасных и печатаемых символов ASCII на входе (включая астральные символы!), И реализует все именованные ссылки на символы (не только в HTML4), используйте библиотеку he (отказ от ответственности: эта библиотека принадлежит мне ). Из README:

he (для «HTML-сущностей») - надежный кодировщик / декодер HTML-сущностей, написанный на JavaScript. Он поддерживает все стандартизированные ссылки на именованные символы в соответствии с HTML , обрабатывает неоднозначные амперсанды и другие крайние случаи, как и браузер , имеет обширный набор тестов и - в отличие от многих других решений JavaScript - он отлично обрабатывает астральные символы Unicode.Доступна онлайн-демонстрация.

Также см. Этот соответствующий ответ о переполнении стека .


12
Кроме того, размер библиотеки HE ... 84 КБ! Autch ... Попробуйте скачать это на мобильный телефон через меньшее соединение. Где-то должен быть найден компромисс ..
Флориан Мертенс

1
@FlorianMertens После минификации + gzip он составляет ~ 24 КБ. Это все еще много, но в конце концов, если вы хотите правильно декодировать объекты HTML, вам понадобятся все данные о них - нет никакого способа обойти это. Если вы можете найти способ уменьшить размер библиотеки без ущерба для производительности, отправьте запрос на перенос.
Матиас Байненс

2
@MathiasBynens, без сомнения, ваша библиотека хороша, но вы можете использовать поле для комментариев, чтобы выделить проблему в принятых ответах, и, пожалуйста, отправьте свой улучшенный ответ в блоке кода
diEcho

3
@drzaus Изображения могут быть большими, потому что они хранят большой объем данных, а менее сжатые данные быстрее декодируются. Однако программный код отличается, очень часто добавляется целая библиотека, и она мало используется. Код библиотек иногда содержит больше строк, чем ваш собственный код! К тому же немногие будут беспокоиться о поиске / отладке проблем с библиотекой и отправке отчетов об ошибках (или даже об обновлении библиотеки), поэтому утечки памяти или другие проблемы могут сохраняться в программном обеспечении со многими библиотеками с непроверенным кодом. Если кто-то просто хочет закодировать / экранировать html-небезопасные символы, потребуется всего несколько строк, а не 80 КБ.
bryc

1
@MarcoKlein Да, я объясняю это в своем посте. Это действительно проблема, от которой страдает ошибочный фрагмент кода. В решении, на которое я указываю, такой проблемы нет. (см. «включая астральные символы!»)
Матиас

29

У меня была такая же проблема, и я создал 2 функции для создания сущностей и преобразования их обратно в обычные символы. Следующие методы преобразуют любую строку в сущности HTML и обратно в прототип String.

/**
 * Convert a string to HTML entities
 */
String.prototype.toHtmlEntities = function() {
    return this.replace(/./gm, function(s) {
        // return "&#" + s.charCodeAt(0) + ";";
        return (s.match(/[a-z0-9\s]+/i)) ? s : "&#" + s.charCodeAt(0) + ";";
    });
};

/**
 * Create string from HTML entities
 */
String.fromHtmlEntities = function(string) {
    return (string+"").replace(/&#\d+;/gm,function(s) {
        return String.fromCharCode(s.match(/\d+/gm)[0]);
    })
};

Затем вы можете использовать его следующим образом:

var str = "Test´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en tést".toHtmlEntities();
console.log("Entities:", str);
console.log("String:", String.fromHtmlEntities(str));

Вывод в консоль:

Entities: &#68;&#105;&#116;&#32;&#105;&#115;&#32;&#101;&#180;&#8224;&#174;&#165;&#168;&#169;&#729;&#8747;&#248;&#8230;&#710;&#402;&#8710;&#247;&#8721;&#8482;&#402;&#8710;&#230;&#248;&#960;&#163;&#168;&#160;&#402;&#8482;&#101;&#110;&#32;&#116;&#163;&#101;&#233;&#115;&#116;
String: Dit is e´†®¥¨©˙∫ø…ˆƒ∆÷∑™ƒ∆æø𣨠ƒ™en t£eést 

Это решение работает и на tvOS, поэтому во всех случаях может решить проблемы с кодированием.
loretoparisi

4
Разве это не экстремально? Вы конвертируете все в объекты HTML, даже «безопасные» символы, такие как «abc», «123» ... даже пробелы
AJPerez

1
Это плохой ответ. Более 50% документов в Интернете содержат в основном latin1 с некоторым кодом utf-8. Ваша кодировка безопасных символов увеличит ее размер от 500% до 600% без каких-либо преимуществ.
HoldOffHunger

Пожалуйста, объясните назначение mмодификатора шаблона в шаблоне без привязок. Значит, вы хотите использовать sузор, содержащий точку?
mickmackusa

19

Без какой-либо библиотеки, если вам не нужна поддержка IE <9, вы можете создать элемент html и установить его содержимое с помощью Node.textContent :

var str = "<this is not a tag>";
var p = document.createElement("p");
p.textContent = str;
var converted = p.innerHTML;

Вот пример: https://jsfiddle.net/1erdhehv/


2
Почему бы не использовать innerText вместо textContent?
Рик

@Rick, попробуйте документ MDN для textContent, связанного в ответе. Цитируя его: «textContent и HTMLElement.innerText легко спутать, но эти два свойства во многом различаются ».
Адарша,

17

Вы можете использовать это.

var escapeChars = {
  '¢' : 'cent',
  '£' : 'pound',
  '¥' : 'yen',
  '€': 'euro',
  '©' :'copy',
  '®' : 'reg',
  '<' : 'lt',
  '>' : 'gt',
  '"' : 'quot',
  '&' : 'amp',
  '\'' : '#39'
};

var regexString = '[';
for(var key in escapeChars) {
  regexString += key;
}
regexString += ']';

var regex = new RegExp( regexString, 'g');

function escapeHTML(str) {
  return str.replace(regex, function(m) {
    return '&' + escapeChars[m] + ';';
  });
};

https://github.com/epeli/underscore.string/blob/master/escapeHTML.js

var htmlEntities = {
    nbsp: ' ',
    cent: '¢',
    pound: '£',
    yen: '¥',
    euro: '€',
    copy: '©',
    reg: '®',
    lt: '<',
    gt: '>',
    quot: '"',
    amp: '&',
    apos: '\''
};

function unescapeHTML(str) {
    return str.replace(/\&([^;]+);/g, function (entity, entityCode) {
        var match;

        if (entityCode in htmlEntities) {
            return htmlEntities[entityCode];
            /*eslint no-cond-assign: 0*/
        } else if (match = entityCode.match(/^#x([\da-fA-F]+)$/)) {
            return String.fromCharCode(parseInt(match[1], 16));
            /*eslint no-cond-assign: 0*/
        } else if (match = entityCode.match(/^#(\d+)$/)) {
            return String.fromCharCode(~~match[1]);
        } else {
            return entity;
        }
    });
};

4
Ручное добавление случайного подмножества кодируемых символов, вероятно, создаст проблемы для вас и ваших коллег в будущем. Должен быть единый орган, для которого символы должны кодироваться, возможно, браузер или, в противном случае, конкретная библиотека, которая, вероятно, будет всеобъемлющей и поддерживаемой.
user234461

Отличный момент, @ user234461. Если кто-нибудь найдет этот единственный авторитет, пытливые умы (вроде меня) захотят узнать!
idungotnosn

7

Если вы хотите избежать кодирования html-сущностей более одного раза

function encodeHTML(str){
    return str.replace(/([\u00A0-\u9999<>&])(.|$)/g, function(full, char, next) {
      if(char !== '&' || next !== '#'){
        if(/[\u00A0-\u9999<>&]/.test(next))
          next = '&#' + next.charCodeAt(0) + ';';

        return '&#' + char.charCodeAt(0) + ';' + next;
      }

      return full;
    });
}

function decodeHTML(str){
    return str.replace(/&#([0-9]+);/g, function(full, int) {
        return String.fromCharCode(parseInt(int));
    });
}

# Пример

var text = "<a>Content &#169; <#>&<&#># </a>";

text = encodeHTML(text);
console.log("Encode 1 times: " + text);

// &#60;a&#62;Content &#169; &#60;#&#62;&#38;&#60;&#38;#&#62;# &#60;/a&#62;

text = encodeHTML(text);
console.log("Encode 2 times: " + text);

// &#60;a&#62;Content &#169; &#60;#&#62;&#38;&#60;&#38;#&#62;# &#60;/a&#62;

text = decodeHTML(text);
console.log("Decoded: " + text);

// <a>Content © <#>&<&#># </a>

Это полезно только в том случае, если у вас есть смешанный частично экранированный текст для начала, и он вносит ошибки, поскольку не может правильно кодировать все строки: <#>будет выглядеть как<#&#62;
Рик

@Rick Спасибо, что заметили меня об этом, я обновил свой ответ, чтобы сделать его лучше.
StefansArya

4

Специальные символы HTML и их ESCAPE CODES

Зарезервированные символы должны быть экранированы с помощью HTML: мы можем использовать экранирование символа для представления любого символа Юникода [Пример: & - U + 00026] в HTML, XHTML или XML, используя только символы ASCII. Ссылки на числовые символы [ Пример: амперсанд (&) - &#38;] & Ссылки на именованные символы [Пример: &amp;] являются типами character escape used in markup.


Предопределенные объекты

    Original Character     XML entity replacement    XML numeric replacement  
                  <                                    &lt;                                           &#60;                    
                  >                                     &gt;                                         &#62;                    
                  "                                     &quot;                                      &#34;                    
                  &                                   &amp;                                       &#38;                    
                   '                                    &apos;                                      &#39;                    

Для отображения HTML - теги в качестве нормальной формы в веб - страницы , мы используем <pre>, <code>теги или мы можем избежать их. Экранирование строки путем замены любым вхождением "&"символа в строке "&amp;"и любых вхождений ">"символа в строке "&gt;". Пример:stackoverflow post

function escapeCharEntities() {
    var map = {
        "&": "&amp;",
        "<": "&lt;",
        ">": "&gt;",
        "\"": "&quot;",
        "'": "&apos;"
    };
    return map;
}

var mapkeys = '', mapvalues = '';
var html = {
    encodeRex : function () {
        return  new RegExp(mapkeys, 'g'); // "[&<>"']"
    }, 
    decodeRex : function () {
        return  new RegExp(mapvalues, 'g'); // "(&amp;|&lt;|&gt;|&quot;|&apos;)"
    },
    encodeMap : JSON.parse( JSON.stringify( escapeCharEntities () ) ), // json = {&: "&amp;", <: "&lt;", >: "&gt;", ": "&quot;", ': "&apos;"}
    decodeMap : JSON.parse( JSON.stringify( swapJsonKeyValues( escapeCharEntities () ) ) ),
    encode : function ( str ) {
        var encodeRexs = html.encodeRex();
        console.log('Encode Rex: ', encodeRexs); // /[&<>"']/gm
        return str.replace(encodeRexs, function(m) { console.log('Encode M: ', m); return html.encodeMap[m]; }); // m = < " > SpecialChars
    },
    decode : function ( str ) {
        var decodeRexs = html.decodeRex();
        console.log('Decode Rex: ', decodeRexs); // /(&amp;|&lt;|&gt;|&quot;|&apos;)/g
        return str.replace(decodeRexs, function(m) { console.log('Decode M: ', m); return html.decodeMap[m]; }); // m = &lt; &quot; &gt;
    }
};

function swapJsonKeyValues ( json ) {
    var count = Object.keys( json ).length;
    var obj = {};
    var keys = '[', val = '(', keysCount = 1;
    for(var key in json) {
        if ( json.hasOwnProperty( key ) ) {
            obj[ json[ key ] ] = key;
            keys += key;
            if( keysCount < count ) {
                val += json[ key ]+'|';
            } else {
                val += json[ key ];
            }
            keysCount++;
        }
    }
    keys += ']';    val  += ')';
    console.log( keys, ' == ', val);
    mapkeys = keys;
    mapvalues = val;
    return obj;
}

console.log('Encode: ', html.encode('<input type="password" name="password" value=""/>') ); 
console.log('Decode: ', html.decode(html.encode('<input type="password" name="password" value=""/>')) );

O/P:
Encode:  &lt;input type=&quot;password&quot; name=&quot;password&quot; value=&quot;&quot;/&gt;
Decode:  <input type="password" name="password" value=""/>

Это отлично подходит для добавления исходного кода html в формате Json в строку iframe srcdoc.
Ним Клауд

Это не включает ®, так что это не поможет OP. Кроме того, этот JS намного сложнее, чем многие другие решения, даже те, которые используют только короткое сопоставление, подобное этому. swapJsonKeyValues ​​плохо назван, поскольку он требует побочных эффектов (определение ключей карты и значений карты)
Рик,

@mickmackusa Я обновил сообщение значениями отладки. mсодержит специальные символы входной строки.
Yash

Если в посте есть ошибка. Итак, попробуйте исправить сообщение и оставить комментарии.
Яш

3
var htmlEntities = [
            {regex:/&/g,entity:'&amp;'},
            {regex:/>/g,entity:'&gt;'},
            {regex:/</g,entity:'&lt;'},
            {regex:/"/g,entity:'&quot;'},
            {regex:/á/g,entity:'&aacute;'},
            {regex:/é/g,entity:'&eacute;'},
            {regex:/í/g,entity:'&iacute;'},
            {regex:/ó/g,entity:'&oacute;'},
            {regex:/ú/g,entity:'&uacute;'}
        ];

total = <some string value>

for(v in htmlEntities){
    total = total.replace(htmlEntities[v].regex, htmlEntities[v].entity);
}

Решение массива


3
Пожалуйста, объясните, как это решает проблему лучше, чем описано выше. На первый взгляд может показаться, что это решение работает медленнее, потому что оно изменяет строку за несколько проходов, а не за один проход. Однако могу ошибаться. В любом случае, вы должны подкрепить свой пост объяснением.
Джек Гиффин

Это альтернатива, вы можете использовать регулярное выражение прямо из массива ...: D
Cesar De la Cruz

Это одно регулярное выражение для каждого символа (для v в ....). Если вы хотите охватить весь UTF-8, это будет 65 000 регулярных выражений и 65 000 строк выполнения.
HoldOffHunger

2
Меня интересует преобразование только трех символов в сущности, поэтому этот ответ в моем случае лучше, и я рад, что он был здесь,
Дрю

2

Если вы уже используете jQuery, попробуйте html().

$('<div>').text('<script>alert("gotcha!")</script>').html()
// "&lt;script&gt;alert("gotcha!")&lt;/script&gt;"

Текстовый узел в памяти создается и html()вызывается на нем.

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

Взято из сообщения в блоге. Кодируйте объекты HTML с помощью jQuery, автор Феликс Гейзендорфер.


3
Чтобы избежать создания экземпляра узла каждый раз, вы можете сохранить узел: var converter=$("<div>");и позже использовать его повторно: html1=converter.text(text1).html(); html2=converter.text(text2).html();...
FrancescoMM

1

Иногда вы просто хотите закодировать каждый символ ... Эта функция заменяет «все, кроме ничего» в regxp.

function encode(e){return e.replace(/[^]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}


1
Заменить ^на , .чтобы сохранить смайлики: function encode(e){return e.replace(/[.]/g,function(e){return"&#"+e.charCodeAt(0)+";"})}.
Swiss Mister

1

Ознакомьтесь с руководством на сайте Ourcodeworld Ourcodeworld - кодируйте и декодируйте объекты HTML с помощью javascript

Самое главное, что библиотека пример

he.encode('foo © bar ≠ baz ???? qux');
// → 'foo &#xA9; bar &#x2260; baz &#x1D306; qux'

// Passing an `options` object to `encode`, to explicitly encode all symbols:
he.encode('foo © bar ≠ baz ???? qux', {
 'encodeEverything': true
});

he.decode('foo &copy; bar &ne; baz &#x1D306; qux');
// → 'foo © bar ≠ baz ???? qux'

Эта библиотека, вероятно, упростит ваше кодирование и сделает его более управляемым. Он популярен, регулярно обновляется и соответствует спецификации HTML. Сам он не имеет зависимостей, как это видно в package.json.


OP попросил vanilla JS, а vanilla JS предлагает element.innerText. Если у библиотеки есть преимущество, пожалуйста, добавьте его в свой ответ.
Рик

0

Вот как я реализовал кодировку. Я черпал вдохновение из приведенных выше ответов.

function encodeHTML(str) {
  const code = {
      ' ' : '&nbsp;',
      '¢' : '&cent;',
      '£' : '&pound;',
      '¥' : '&yen;',
      '€' : '&euro;', 
      '©' : '&copy;',
      '®' : '&reg;',
      '<' : '&lt;', 
      '>' : '&gt;',  
      '"' : '&quot;', 
      '&' : '&amp;',
      '\'' : '&apos;'
  };
  return str.replace(/[\u00A0-\u9999<>\&''""]/gm, (i)=>code[i]);
}

// TEST
console.log(encodeHTML("Dolce & Gabbana"));
console.log(encodeHTML("Hamburgers < Pizza < Tacos"));
console.log(encodeHTML("Sixty > twelve"));
console.log(encodeHTML('Stuff in "quotation marks"'));
console.log(encodeHTML("Schindler's List"));
console.log(encodeHTML("<>"));


прерывается для любого ввода в \ u00A0- \ u9999, которого нет в вашем списке
Рик

Пожалуйста, объясните назначение mмодификатора шаблона в шаблоне без привязок.
mickmackusa

-1

Вы можете использовать этот charCodeAt()метод, чтобы проверить, имеет ли указанный символ значение выше 127, и преобразовать его в ссылку на числовой символ с помощью toString(16).


4
Было бы неплохо, если бы вы могли добавить немного о магическом числе 127и о том, как / почему это работает;)
yckart

-1
replaceHtmlEntities(text) {
  var tagsToReplace = {
    '&amp;': '&',
    '&lt;': '<',
    '&gt;': '>',
  };
  var newtext = text;
  for (var tag in tagsToReplace) {
    if (Reflect.apply({}.hasOwnProperty, this, [tagsToReplace, tag])) {
      var regex = new RegExp(tag, 'g');
      newtext = newtext.replace(regex, tagsToReplace[tag]);
    }
  }
  return newtext;
}

-1

<!DOCTYPE html>
<html>
<style>
button {
backround: #ccc;
padding: 14px;
width: 400px;
font-size: 32px;
}
#demo {
font-size: 20px;
font-family: Arial;
font-weight: bold;
}
</style>
<body>

<p>Click the button to decode.</p>

<button onclick="entitycode()">Html Code</button>

<p id="demo"></p>


<script>
function entitycode() {
  var uri = "quotation  = ark __ &apos; = apostrophe  __ &amp; = ampersand __ &lt; = less-than __ &gt; = greater-than __ 	non- = reaking space __ &iexcl; = inverted exclamation mark __ &cent; = cent __ &pound; = pound __ &curren; = currency __ &yen; = yen __ &brvbar; = broken vertical bar __ &sect; = section __ &uml; = spacing diaeresis __ &copy; = copyright __ &ordf; = feminine ordinal indicator __ &laquo; = angle quotation mark (left) __ &not; = negation __ &shy; = soft hyphen __ &reg; = registered trademark __ &macr; = spacing macron __ &deg; = degree __ &plusmn; = plus-or-minus  __ &sup2; = superscript 2 __ &sup3; = superscript 3 __ &acute; = spacing acute __ &micro; = micro __ &para; = paragraph __ &middot; = middle dot __ &cedil; = spacing cedilla __ &sup1; = superscript 1 __ &ordm; = masculine ordinal indicator __ &raquo; = angle quotation mark (right) __ &frac14; = fraction 1/4 __ &frac12; = fraction 1/2 __ &frac34; = fraction 3/4 __ &iquest; = inverted question mark __ &times; = multiplication __ &divide; = division __ &Agrave; = capital a, grave accent __ &Aacute; = capital a, acute accent __ &Acirc; = capital a, circumflex accent __ &Atilde; = capital a, tilde __ &Auml; = capital a, umlaut mark __ &Aring; = capital a, ring __ &AElig; = capital ae __ &Ccedil; = capital c, cedilla __ &Egrave; = capital e, grave accent __ &Eacute; = capital e, acute accent __ &Ecirc; = capital e, circumflex accent __ &Euml; = capital e, umlaut mark __ &Igrave; = capital i, grave accent __ &Iacute; = capital i, acute accent __ &Icirc; = capital i, circumflex accent __ &Iuml; = capital i, umlaut mark __ &ETH; = capital eth, Icelandic __ &Ntilde; = capital n, tilde __ &Ograve; = capital o, grave accent __ &Oacute; = capital o, acute accent __ &Ocirc; = capital o, circumflex accent __ &Otilde; = capital o, tilde __ &Ouml; = capital o, umlaut mark __ &Oslash; = capital o, slash __ &Ugrave; = capital u, grave accent __ &Uacute; = capital u, acute accent __ &Ucirc; = capital u, circumflex accent __ &Uuml; = capital u, umlaut mark __ &Yacute; = capital y, acute accent __ &THORN; = capital THORN, Icelandic __ &szlig; = small sharp s, German __ &agrave; = small a, grave accent __ &aacute; = small a, acute accent __ &acirc; = small a, circumflex accent __ &atilde; = small a, tilde __ &auml; = small a, umlaut mark __ &aring; = small a, ring __ &aelig; = small ae __ &ccedil; = small c, cedilla __ &egrave; = small e, grave accent __ &eacute; = small e, acute accent __ &ecirc; = small e, circumflex accent __ &euml; = small e, umlaut mark __ &igrave; = small i, grave accent __ &iacute; = small i, acute accent __ &icirc; = small i, circumflex accent __ &iuml; = small i, umlaut mark __ &eth; = small eth, Icelandic __ &ntilde; = small n, tilde __ &ograve; = small o, grave accent __ &oacute; = small o, acute accent __ &ocirc; = small o, circumflex accent __ &otilde; = small o, tilde __ &ouml; = small o, umlaut mark __ &oslash; = small o, slash __ &ugrave; = small u, grave accent __ &uacute; = small u, acute accent __ &ucirc; = small u, circumflex accent __ &uuml; = small u, umlaut mark __ &yacute; = small y, acute accent __ &thorn; = small thorn, Icelandic __ &yuml; = small y, umlaut mark";
  var enc = encodeURI(uri);
  var dec = decodeURI(enc);
  var res = dec;
  document.getElementById("demo").innerHTML = res;
}
</script>

</body>
</html>


Кажется, это не отвечает на вопрос, и это только код. Пожалуйста, опишите, что делает код и как это связано с вопросом.
Рик
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.