假设我从一个服务请求中得到了一些JSON,看起来像这样:

{
    "message": "We're unable to complete your request at this time."
}

我不知道为什么那个撇号是这样编码的(');我只知道我想解码它。

下面是我突然想到的一个使用jQuery的方法:

function decodeHtml(html) {
    return $('<div>').html(html).text();
}

不过,这似乎(非常)俗气。还有什么更好的办法吗?有“正确”的方法吗?


当前回答

这是我最喜欢的解码HTML字符的方法。使用此代码的优点是还保留了标记。

function decodeHtml(html) {
    var txt = document.createElement("textarea");
    txt.innerHTML = html;
    return txt.value;
}

例如:http://jsfiddle.net/k65s3/

输入:

Entity:&nbsp;Bad attempt at XSS:<script>alert('new\nline?')</script><br>

输出:

Entity: Bad attempt at XSS:<script>alert('new\nline?')</script><br>

其他回答

_。Unescape就是你想要的

https://lodash.com/docs/#unescape

这是我最喜欢的解码HTML字符的方法。使用此代码的优点是还保留了标记。

function decodeHtml(html) {
    var txt = document.createElement("textarea");
    txt.innerHTML = html;
    return txt.value;
}

例如:http://jsfiddle.net/k65s3/

输入:

Entity:&nbsp;Bad attempt at XSS:<script>alert('new\nline?')</script><br>

输出:

Entity: Bad attempt at XSS:<script>alert('new\nline?')</script><br>

如果你不想使用html/dom,你可以使用regex。我还没有测试过;但是有些事情是这样的:

function parseHtmlEntities(str) {
    return str.replace(/&#([0-9]{1,3});/gi, function(match, numStr) {
        var num = parseInt(numStr, 10); // read num as normal number
        return String.fromCharCode(num);
    });
}

(编辑)

注意:这只适用于数值型的html实体,而不是像&oring这样的东西。

[编辑2]

修正了函数(一些错别字),测试在这里:http://jsfiddle.net/Be2Bd/1/

jQuery将为您编码和解码。

function htmlDecode(value) { return $("<textarea/>").html(value).text(); } function htmlEncode(value) { return $('<textarea/>').text(value).html(); } <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script> $(document).ready(function() { $("#encoded") .text(htmlEncode("<img src onerror='alert(0)'>")); $("#decoded") .text(htmlDecode("&lt;img src onerror='alert(0)'&gt;")); }); </script> <span>htmlEncode() result:</span><br/> <div id="encoded"></div> <br/> <span>htmlDecode() result:</span><br/> <div id="decoded"></div>

有一个JS函数来处理&#xxxx样式的实体: 函数在GitHub

// encode(decode) html text into html entity var decodeHtmlEntity = function(str) { return str.replace(/&#(\d+);/g, function(match, dec) { return String.fromCharCode(dec); }); }; var encodeHtmlEntity = function(str) { var buf = []; for (var i=str.length-1;i>=0;i--) { buf.unshift(['&#', str[i].charCodeAt(), ';'].join('')); } return buf.join(''); }; var entity = '&#39640;&#32423;&#31243;&#24207;&#35774;&#35745;'; var str = '高级程序设计'; let element = document.getElementById("testFunct"); element.innerHTML = (decodeHtmlEntity(entity)); console.log(decodeHtmlEntity(entity) === str); console.log(encodeHtmlEntity(str) === entity); // output: // true // true <div><span id="testFunct"></span></div>