什么是正确的方式来解码一个string,其中有特殊的HTML实体?

说我从一个看起来像这样的服务请求返回一些JSON:

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

我不确定为什么那个apostraphe是这样编码的( ' ); 我所知道的是我想解码它。

下面是使用popup到我脑海中的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/

input:

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

输出:

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

不要使用DOM来做到这一点。 使用DOM解码HTML实体(如当前接受的答案中所build议的)会导致跨浏览器结果的差异 。

对于根据HTML标准中的algorithm对字符引用进行解码的健壮性和确定性解决scheme,请使用he库 。 从它的README:

(用于“HTML实体”)是用JavaScript编写的健壮的HTML实体编码器/解码器。 它支持所有按照HTML标准化的命名字符引用 , 像浏览器一样处理不明确的&符号和其他边界情况,具有广泛的testing套件,与许多其他JavaScript解决scheme相反, 处理的是星体Unicode符号。 在线演示可用。

以下是你如何使用它:

 he.decode("We&#39;re unable to complete your request at this time."); → "We're unable to complete your request at this time." 

免责声明:我是他的图书馆的作者。

看到这个堆栈溢出的答案一些更多的信息。

如果你不想使用html / dom,你可以使用正则expression式。 我没有testing过这个; 但是一些沿着以下方向的东西:

 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]

修正了函数(一些拼写错误),在这里testing: 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> <div id="encoded"></div> <div id="decoded"></div> 

有JS函数来处理&#xxxx样式的实体:
function在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 = '高级程序devise'; console.log(decodeHtmlEntity(entity) === str); console.log(encodeHtmlEntity(str) === entity); // output: // true // true 

_.unescape做你在找什么

http://underscorejs.org/#unescape

这是非常好的答案。 你可以像这样使用这个angular度:

  moduleDefinitions.filter('sanitize', ['$sce', function($sce) { return function(htmlCode) { var txt = document.createElement("textarea"); txt.innerHTML = htmlCode; return $sce.trustAsHtml(txt.value); } }]);