单行字符串中的ILLEGAL标记/未终止字符串文字

时间:2014-06-04 15:45:16

标签: javascript ruby-on-rails

我知道,有很多关于"未终止的字符串文字"已经回答了很多问题。 Javascript中的错误,但我无法找到我正在使用的某个字符串的错误。它是一个单行字符串(因此不需要特殊的行结尾),所有内容似乎都被正确转义。

我的应用程序允许学生提交计算机科学各种练习的解决方案,这里的特定练习是用当前的注册内容来评论汇编程序代码。因此,提交的解决方案包含许多特殊字符。

可以使用AJAX将解决方案加载到应用程序的页面中,基本上只是jQuery('#elem').html()调用,并使用Rails'来转义其文本。 escape_javascript帮助者。

这适用于所有其他解决方案,而不是这个。我通过JS验证器(http://esprima.org/demo/validate.html)运行它,它给我直接运行时得到的相同错误,但我仍然不知道字符串的哪个部分导致它。


原始文本(包含所有控制序列,因此在一行中)是:

// Kommentierte Register mit Berechnungen, unten mit gegebenen Variaben.\r\n\r\nint dummy(int y, int* z)\r\n   {\r\n       asm (\r\n01         \"movl 0x8(%ebp), %ecx\\n“ \t\r\n\t\t\t\t//%eax=? ; %ecx=y ; %edx=?\r\n02         \"movl 0xc(%ebp), %eax\\n\" \t\r\n\t\t\t\t//%eax=z ; %ecx=y ; %edx=?\r\n03         \"movl (%eax), %edx\\n\"\t\t\r\n\t\t\t\t//%eax=z ; %ecx=y ; %edx=z\r\n04         \"xorl %eax, %eax\\n“ \t\t\r\n\t\t\t\t//%eax=0 ; %ecx=y ; %edx=z\r\n05         \"addl %edx, %eax\\n\"\t\t\r\n\t\t\t\t//%eax=z ; %ecx=y ; %edx=z\r\n06         \"imull %ecx, %eax\\n\"\t\t\r\n\t\t\t\t//%eax=y*z ; %ecx=y ; %edx=z\r\n07         \"andl %eax, %edx\\n\"\t\t\r\n\t\t\t\t//%eax=y*z ; %ecx=y ; %edx=(y*z)&z\r\n08         \"leal (, %eax, 4), %eax\\n\"\t\r\n\t\t\t\t//%eax=4(y*z) ; %ecx=y ; %edx=(y*z)&z\r\n09         \"notl %eax\\n\"\t\t\t\r\n\t\t\t\t//%eax=~4(y*z) ; %ecx=y ; %edx=(y*z)&z\r\n10         \"andl $15, %eax\\n\"\t\t\t\r\n\t\t\t\t//%eax=~4(y*z)&15 ; %ecx=y ; %edx=(y*z)&z\r\n11         \"imull %eax, %edx\\n\"\t\t\r\n\t\t\t\t//%eax=~4(y*z)&15 ; %ecx=y ; %edx=((y*z)&z) * (~4(y*z)&15)\r\n12         \"movl 0xc(%ebp), %eax\\n\" \t\r\n\t\t\t\t//%eax=z ; %ecx=y ; %edx=((y*z)&z) * (~4(y*z)&15)\r\n13         \"movl %edx,(%eax)\\n\"\t\t\r\n\t\t\t\t//%eax=*((y*z)&z) * (~4(y*z)&15) ; %ecx=y ; %edx=((y*z)&z) * (~4(y*z)&15)\r\n14         \"xorl %eax, %eax\\n\"\t\t\r\n\t\t\t\t//%eax=0 ; %ecx=y ; %edx=((y*z)&z) * (~4(y*z)&15)\r\n\r\n       );\r\n   }\r\n   \r\n   int main()\r\n   {\r\n       int a = 10;\r\n       int temp = dummy(2, &a);\r\n       printf(\"Rueckgabe von dummy(2, &a) fuer a == 10: %d (Inhalt von eax)\\n\",\r\n              temp);\r\n       printf(\"Neuer Wert von a: %d\\n\", a);\r\n       return 0;\r\n   }
\r\n\r\n\r\n//Mit Variablen:\r\n\r\n\r\n//y=2, *z= *a (=10)\r\n\r\nint dummy(int y, int* z)\r\n   {\r\n       asm (\r\n01         \"movl 0x8(%ebp), %ecx\\n“\t\t\t//%eax=? ; %ecx=2 ; %edx=?\r\n02         \"movl 0xc(%ebp), %eax\\n\" \t\t//%eax=0xA ; %ecx=2 ; %edx=?\r\n03         \"movl (%eax), %edx\\n\"\t\t\t//%eax=0xA ; %ecx=2 ; %edx=10\r\n04         \"xorl %eax, %eax\\n“ \t\t\t\t//%eax=0 ; %ecx=2 ; %edx=10\r\n05         \"addl %edx, %eax\\n\"\t\t\t\t//%eax=10 ; %ecx=2 ; %edx=10\r\n06         \"imull %ecx, %eax\\n\"\t\t\t\t//%eax=20 ; %ecx=2 ; %edx=10\r\n07         \"andl %eax, %edx\\n\"\t\t\t\t//%eax=20 ; %ecx=2 ; %edx=0\r\n08         \"leal (, %eax, 4), %eax\\n\"\t\t//%eax=80 ; %ecx=2 ; %edx=0\r\n09         \"notl %eax\\n\"\t\t\t\t\t//%eax=47 ; %ecx=2 ; %edx=0\r\n10         \"andl $15, %eax\\n\"\t\t\t\t//%eax=15 ; %ecx=2 ; %edx=0\r\n11         \"imull %eax, %edx\\n\"\t\t\t\t//%eax=15 ; %ecx=2 ; %edx=0\r\n12         \"movl 0xc(%ebp), %eax\\n\" \t\t//%eax=0xA ; %ecx=2 ; %edx=0\r\n13         \"movl %edx,(%eax)\\n\"\t\t\t\t//%eax=0xA ; %ecx=2 ; %edx=0\r\n\t\t\t\t\t\t\t\t\t\t\t(speicher Wert von %edx in Register 0xA)\r\n14         \"xorl %eax, %eax\\n\"\t\t\t\t//%eax=0 ; %ecx=2 ; %edx=0\r\n\r\n       );\r\n   } 

可以在此JSFiddle中找到生成和转义的JavaScript代码。它在浏览器的javascript控制台中抛出相同的错误。

字符串中有一些引号似乎没有被转义,但是它们是不同的ASCII字符(例如0x8(%ebp), %ecx\n“,并且应该不是问题。

我到目前为止所尝试的是从字符串中删除某些元素(即正斜杠,百分比符号,特殊引号甚至是正常的引号),然后逃避它,但到目前为止没有任何帮助。

我只是失明并且遗漏了一些明显的东西,或者是否存在导致此错误的秘密javascript控制序列?

提前致谢!

修改:

当我从firebug(CTRL-C - > CTRL-V)复制响应体时,将其发布到其控制台并直接运行,它完全正常。

然而,当我右键单击请求并选择"复制响应主体"时,我无法在不收到错误的情况下运行它。

我通过差异运行它并得到以下结果:http://www.diffchecker.com/8y3eu2l5

似乎没有明显的区别,那么哪个角色会导致它?

编辑2:

万一有人偶然发现同样的问题:Rails中的escape_javascript方法似乎并没有自动转义这些字符(至少在我使用的Rails版本中没有)。

使用解决方案指出here现在一切都很完美。

1 个答案:

答案 0 :(得分:1)

你在文本\n\n\n//Mit Variablen之前有一个奇怪的角色导致错误。我不确定它是什么字符,但它会导致插入失败。

编辑:它是一个unicode行分隔字符(代码2028),如here所述。因为它不会在大多数输出​​上打印,所以您无法发现它。在JSFiddle,它是可见的,它被标记为红点。