假设我从一个服务请求中得到了一些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: Bad attempt at XSS:<script>alert('new\nline?')</script><br>
输出:
Entity: Bad attempt at XSS:<script>alert('new\nline?')</script><br>
这是我最喜欢的解码HTML字符的方法。使用此代码的优点是还保留了标记。
function decodeHtml(html) {
var txt = document.createElement("textarea");
txt.innerHTML = html;
return txt.value;
}
例如:http://jsfiddle.net/k65s3/
输入:
Entity: 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/
有一个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 = '高级程序设计';
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>