双重转义的Unicode Javascript问题

时间:2008-11-08 18:17:46

标签: javascript unicode escaping

我在显示带有嵌入式Unicode字符转义序列(\ uXXXX)的Javascript字符串时出现问题,其中初始“\”字符本身已转义为“\” 我需要做什么来转换字符串,以便正确评估转义序列并使用正确的Unicode字符生成输出?

例如,我正在处理输入,例如:

"this is a \u201ctest\u201d";

尝试解码“\”使用正则表达式,例如:

var out  = text.replace('/\/g','\');

导致输出文本:

"this is a \u201ctest\u201d";

也就是说,Unicode转义序列显示为实际的转义序列,而不是我想要的双引号字符。

5 个答案:

答案 0 :(得分:6)

事实证明,它是我们想要的unescape(),但使用'%uXXXX'而不是'\ uXXXX':

UNESCAPE(yourteststringhere.replace(/&安培;#92; /克, '%'))

答案 1 :(得分:1)

这是一个糟糕的解决方案,但你可以这样做:

var x = "this is a \u201ctest\u201d".replace(/\/g,'\\')
// x is now "this is a \u201ctest\u201d"
eval('x = "' + x + '"')
// x is now "this is a “test”"

这太可怕了,因为:

  • 如果您不知道字符串中的内容,则eval可能很危险

  • 如果字符串中有实际的引号,则eval语句中的字符串引用会中断

答案 2 :(得分:1)

您确定'\'是唯一可能获得HTML转义的角色吗?你确定'\ uXXXX'是唯一使用的字符串转义吗?

如果没有,你需要一个通用的HTML字符/实体参考解码器和JS字符串文字解码器。不幸的是,JavaScript没有内置的方法,手动使用一大堆regexp是非常繁琐的。

通过将字符串分配给元素的innerHTML属性,然后让JavaScript解码字符串,可以利用浏览器的HTML解码器:

var el= document.createElement('div');
el.innerHTML= s;
return eval('"'+el.firstChild.data+'"');

然而,如果字符串来自不是100%信任的来源,那么这是一个令人难以置信的丑陋黑客和安全漏洞。

字符串来自哪里?如果可能的话,在服务器端处理问题会更好,你可能会有更强大的文本处理功能。如果你可以修复任何不必要的HTML转义你的反斜杠你可以发现问题自己修复。

答案 3 :(得分:0)

我不确定是不是这样,但如果您可以信任您的输入,答案可能与eval()有关。

答案 4 :(得分:0)

我在思考同样的问题,但是在我能想象到的每一个方面都使用了eval()导致了相同的转义输出;如,

eval(new String("this is a \u201ctest&#amp;92;u201d"));

甚至

eval(new String("this is a \u201ctest&#amp;92;u201d".replace('/\/g','\')));

所有结果都是一样的:

"this is a \u201ctest\u201d";

就好像我需要让Javascript引擎以某种方式重新评估或重新解析字符串,但我不知道它会做什么。我想也许eval()或者只是使用正确的转义输入创建一个新字符串就可以了,但现在好运。

根本问题是 - 如何改变给定的字符串:

"this is a \u201ctest&#amp;92;u201d"

到一个使用正确的Unicode字符的字符串?