Javascript 更有效地替换页面上的转义unicode字符?

Javascript 更有效地替换页面上的转义unicode字符?,javascript,html,encoding,prototypejs,Javascript,Html,Encoding,Prototypejs,我有一个包含转义Unicode字符的页面。(例如字符)漢字 转义为\u6F22\u5B57)。我有一个方法可以转换所有Unicode转义字符,但速度不是很快 function DecodeAllUnicodeCharacters (strID) { var strstr = $(strID).innerHTML; var arrEncodeChars = strstr.match(/\\u[0-9A-Z]{4,6}/g); for (var ii = 0; ii <

我有一个包含转义Unicode字符的页面。(例如字符)漢字 转义为\u6F22\u5B57)。我有一个方法可以转换所有Unicode转义字符,但速度不是很快

function DecodeAllUnicodeCharacters (strID)
{
    var strstr = $(strID).innerHTML;
    var arrEncodeChars = strstr.match(/\\u[0-9A-Z]{4,6}/g);
    for (var ii = 0; ii < arrEncodeChars.length; ii++) {
        var sUnescaped = eval("unescape('"+arrEncodeChars[ii]+"')");
        strstr = strstr.replace(arrEncodeChars[ii], sUnescaped);
    }
    $(strID).innerHTML = strstr;
}
函数解码字符(strID)
{
var strstr=$(strID).innerHTML;
var arrEncodeChars=strstr.match(/\\u[0-9A-Z]{4,6}/g);
对于(变量ii=0;ii
耗时最长的部分是在此处设置innerHTML:$(strID);
有没有一种好方法可以在不重做整个页面的innerHTML的情况下替换字符?

这就是您想要的吗

function DecodeAllUnicodeCharacters(id) {
    $(id).innerHTML = decodeURI($(id).innerHTML);
}

设置
innerHTML
很慢的原因是,这会导致浏览器将其解析为HTML,如果存在子元素,则会重新创建它们,这非常慢。相反,如果它们包含转义内容,我们需要找到正确的方法并有选择地处理它们。我以以下内容为基础并进行了演示

除了美学之外,它的好处是功能模式。您可以通过以下几种方式使用
decodeUnicode

// single element
$('element_id').decodeUnicode();
// or
Element.decodeUnicode('element_id');

// multiple elements
$$('p').each(Element.decodeUnicode);
// or
$$('p').invoke('decodeUnicode');

我不认为这需要在客户端完成。我真的希望我可以在服务器端完成。我真的喜欢。但是如果我想发送未编码的字符,那么我需要用更现代的字符串替换代码中的所有字符串。重新编写可能需要一年时间。我的老板不会接受的,所以我必须添加一个javascript攻击。你说的“现代字符串”是什么意思?难道不能用编程的方式重写吗?现代字符串指的是像std::string这样的东西,它可以处理32位unicode字符。我可能会夸张地说一年,但我们的代码库是一个10多年的混乱字符串,只能在我们公司使用的类似字符串的对象中进行转换。这不是我可以用ctrl+R替换的东西。另一个原因是,我可能不得不更改一堆公司库,我很难告诉其他人,他们需要更改代码,只是因为我想让我的工作更轻松。我想我必须在JavaScript中进行更改。你看,我只想解码\uxxx个字符。如果对html元素运行decodeURI(),则会使html元素变形。因此,非常重要的一点是,我只对我想要更改的字符运行unecode(),而不是对整个页面运行。另外,$(id).innerHTML=decodeURI($(id).innerHTML;的运行速度与上面的代码大致相同,因为大部分时间都被$(id).innerHTML=“页面的html”占用。我特意编写了自己的解码方法,而不是
unescape
,因为(1)
unescape
不推荐使用(2)它只在
eval
中工作,
eval
速度慢且危险(3)这并不复杂。我刚刚意识到这在原来的问题中没有任何效果,因为它只适用于URL编码。这似乎是有效的,因为使用
eval
将数据放入一个使用\uxxx样式编码的文件中。只需
eval(“““+arrEncodeChars[ii]+””)
// single element
$('element_id').decodeUnicode();
// or
Element.decodeUnicode('element_id');

// multiple elements
$$('p').each(Element.decodeUnicode);
// or
$$('p').invoke('decodeUnicode');