JavaScript和Java代码中的字符串长度不同

21

我有一个JSP页面,其中包含一段JavaScript验证代码,限制了提交时的一定数量字符。我正在使用<textarea>,因此无法像在<input type="text">中那样使用长度属性。

我使用document.getElementById("text").value.length来获取字符串长度。我正在Windows上运行Firefox 3.0(但我也已经测试过IE 6的行为)。表单会被提交到J2EE servlet中。在我的Java Servlet中,参数的字符串长度大于2000!

我注意到这可以通过在<textarea>中添加换行符轻松地重现。我使用Firebug来确认<textare>的长度,它确实是2000个字符长。然而,在Java方面,换行符被转换为UNIX样式(\r\n,而不是\n),因此字符串长度不同!

我是否漏掉了什么明显的东西?如果没有,您将如何可靠地(跨平台/浏览器)确保<textarea>受到限制。


@François:在反引号中将事物括起来(例如,将它们格式化为代码),否则它们将在显示问题时被剥离。 - Tomalak
刚好遇到了这种情况。您的主题让我感到非常开心,先生!非常感谢! - varnie
3个回答

26

这并不是一个JavaScript(或Java)问题 - 两个层面都报告了它们所处理的字符串的准确长度。在您的情况下,问题在于字符串在HTTP传输过程中被转换了。

如果您绝对必须确保字符串不超过一定长度,您可以在客户端模拟此转换,通过将每个“\n”实例替换为“\n\r” - 但仅限于长度验证目的:

textarea.value.replace(/\n/g, "\r\n").length

3
注意:代码应为 textarea.value.replace(/\n/g, "\n\r").length 以查找所有匹配项。原始代码只查找第一个匹配项。 - Dan
4
应该用 "\r\n",而不是 "\n\r" - Christoffer Hammarström
1
记住正确的顺序是\r\n,其中\r代表回车(Cr),\n代表换行(Lf)在CrLf中。 - Camilo Martin
我认为你需要在客户端和服务器上都进行行尾转换/检查,因为你不知道客户端浏览器将使用什么行尾(即使在Windows上Firefox也会提交\n),如果你在Windows上开发服务器端并在Linux上部署,则行尾将被处理得不同。 - Ryan

11
你是否特别关心所使用的行尾符?为什么不让Java将"\r\n"转换为"\n"?(请注意,"\r\n"是Windows风格;"\n"是Unix风格。)
或者,在JavaScript中检查长度时做出相反的处理。

好的,我明白了。我猜这意味着Javascript在内部和通过其API(即length())始终以UNIX方式表示回车符。由于Java虚拟机在Windows上运行,所以某种程度上它会被转换为\r\n。我希望它能更加统一... - François P.
1
我不知道不同浏览器在servlet引擎上会应用什么规则,但规范化应该无论如何都可以消除差异。顺便说一句,在Mac上也值得尝试,因为\r是正常的换行符。 - Jon Skeet
+1 只需删除所有的 "\r",无论你使用什么平台,包括 Mac,大家都会很开心。 - Vincent Robert

1

你是将它限制在2000个字符以适应数据库中的nvarchar(2000)列吗?否则,可能只需允许2%的超额运行以在Java端具有灵活性。

而且Java应该使用Unicode UTF16来表示字符串。那个/r肯定是从其他地方进入的,也许是在提交时在Web浏览器中进行转换?您尝试过不同的浏览器吗?在不同的平台上?您可能只需要剥离/r


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接