我在显示带有嵌入式Unicode字符转义序列(\ uXXXX)的Javascript字符串时出现问题,其中初始“\”字符本身已转义为“\” 我需要做什么来转换字符串,以便正确评估转义序列并使用正确的Unicode字符生成输出?
例如,我正在处理输入,例如:
"this is a \u201ctest\u201d";
尝试解码“\”使用正则表达式,例如:
var out = text.replace('/\/g','\');
导致输出文本:
"this is a \u201ctest\u201d";
也就是说,Unicode转义序列显示为实际的转义序列,而不是我想要的双引号字符。
答案 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字符的字符串?