9

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

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

"this is a \u201ctest\u201d";

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

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

结果输出文本:

"this is a \u201ctest\u201d";

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

4

5 回答 5

6

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

unescape(yourteststringhere.replace(/\/g,'%'))

于 2008-11-08T19:03:50.820 回答
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 语句中的字符串引用将中断

于 2008-11-08T19:05:12.720 回答
1

您确定 '\' 是唯一可能被 HTML 转义的字符吗?您确定 '\uXXXX' 是唯一一种正在使用的字符串转义吗?

如果没有,您将需要一个通用的 HTML-character/entity-reference-decoder 和 JS-string-literal-decoder。不幸的是,JavaScript 没有内置的方法,并且手动处理大量的正则表达式非常乏味。

可以通过将字符串分配给元素的 innerHTML 属性来利用浏览器的 HTML 解码器,然后要求 JavaScript 对字符串进行解码,如下所示:

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

但是,如果字符串来自不是 100% 受信任的来源,那么这是一个非常丑陋的黑客攻击和安全漏洞。

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

于 2008-11-09T02:19:41.003 回答
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 字符的字符串?

于 2008-11-08T18:40:32.100 回答
0

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

于 2008-11-08T18:28:22.793 回答