JavaScript中的十六进制转字符串

4

我该如何转换: 从: '\\x3c' 到: '<';

我尝试了以下代码:

s=eval(s.replace("\\\\", "")); 

无法工作。我该怎么做? 提前感谢!
3个回答

12

使用String.fromCharCode替代eval,并且使用16进制的parseInt

s=String.fromCharCode(parseInt(s.substr(2), 16));

1
+1,一个更短的替代方法是 String.fromCharCode(+("0"+s.slice(1))); - Andy E
@Andy 更短的代码:String.fromCharCode("0"+s.slice(1)); - Digital Plane
@DigitalPlane:当然,fromCharCode 会为你转换成整数!呃! :-) - Andy E

1
如果您正在使用jQuery,请尝试以下代码:$('<div>').html('\x3c').text() 否则(摘自这里
function htmlDecode(input){
  var e = document.createElement('div');
  e.innerHTML = input;
  return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue;
}

0

有一种方法可以做到这一点,但会招致那些认为"eval"绝对是邪恶的人的愤怒,具体如下:

var s = "\\x3c";
var s2 = eval('"' + s + '"'); // => "<"

我不会说 eval绝对有害的, 但我会说这不是 eval 的一个可接受的使用方式 (因为存在替代选项)。 - Andy E
@Andy E:好的,我上钩了 =)我同意String.fromCharCode是正确的方法,但是假设我们已经验证了输入(例如,确保它只能是转义字符引用),那么在这里使用eval会有什么潜在的危害呢?对我来说,这似乎是少数几次可以使用eval的情况之一。 - maerics
我并不是在钓鱼;-) 但既然你问了,eval 不仅因为传递未经过处理的值存在安全风险而被避免使用,还因为它的性能较差。虽然 eval 本身很慢(因为它调用了 js 编译器),但它也会使周围的代码变慢。原因在于编译器通常会在解释代码时进行优化,但它无法知道 eval 表达式的结果,因此无法进行这样的优化。确实有一些情况下需要使用 eval,但最终决定是否采用该方法取决于开发人员是否考虑了其他替代方案。 - Andy E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接