JavaScript中含特殊字符的编码字符串解码方案
原生JavaScript解码HTML实体编码字符串(支持多语言)
你遇到的是HTML十进制实体编码,这类编码和URI编码不属于同一范畴,所以decodeURIComponent()、escape()这类处理URI的方法完全不适用。下面提供两种原生JavaScript解法,均不受语言限制:
方法一:利用DOM解析(浏览器环境优先)
浏览器的DOM引擎会自动解析HTML实体,我们可以借助临时元素实现解码:
function decodeHTMLEntities(str) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = str; return tempDiv.textContent || tempDiv.innerText; } // 测试示例 console.log(decodeHTMLEntities('Skæfte')); // 输出 Skæfte console.log(decodeHTMLEntities('sølv')); // 输出 sølv
这种方法能处理所有标准HTML实体(包括&这类命名实体),无需关心字符所属语言,通用性极强。
方法二:纯正则+字符转码(无DOM依赖,支持Node.js)
如果不想依赖DOM环境,可以用正则匹配实体编码,再通过字符码点转码:
function decodeHTMLEntities(str) { // 匹配十进制实体(&#数字;)和十六进制实体(&#x十六进制数;) return str.replace(/&#(\d+);|&#x([a-fA-F0-9]+);/g, (match, decCode, hexCode) => { if (decCode) { return String.fromCharCode(decCode); } if (hexCode) { return String.fromCharCode(parseInt(hexCode, 16)); } return match; }); } // 测试示例 console.log(decodeHTMLEntities('Skæfte')); // Skæfte console.log(decodeHTMLEntities('sølv')); // sølv
这个方法默认处理数值型实体,若需支持æ这类命名实体,可以扩展正则或维护实体映射表,对你的场景而言,现有代码已足够覆盖需求。
内容的提问来源于stack exchange,提问作者Surya
相关产品推荐
相关产品推荐

