【问题标题】:String length differs from Javascript to Java code字符串长度从 Javascript 到 Java 代码不同
【发布时间】:2010-10-02 12:26:23
【问题描述】:

我有一个 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:始终将事物括在反引号中的标签括号中(例如,将它们格式化为代码),否则它们将在您的问题显示时被删除。
  • 刚刚偶然发现了这种情况。你的话题让我很开心,先生!非常感谢!

标签: java javascript string carriage-return


【解决方案1】:

您是否特别关心使用了哪些行尾?为什么不让 Java 将“\r\n”转换为“\n”? (注意,“\r\n”是 Windows 风格;“\n”是 Unix 风格。)

或者,在检查 JavaScript 中的长度时执行相反的操作。

【讨论】:

  • 好的。我知道了。我想这意味着 Javascript 总是在内部和通过其 API(即length())表示回车返回 UNIX 方式。不知何故,我被转换为\r\n,因为 Java VM 在 Windows 上运行。我希望它更统一......
  • 我不知道 servlet 引擎上的不同浏览器会应用哪些规则,但规范化应该可以消除任何一种方式的差异。顺便说一句,在 mac 上也值得尝试,其中 \r 是正常的换行符。
  • +1 只需删除所有“\r”,无论您使用什么平台,每个人都会很高兴。包括 Mac。
【解决方案2】:

您是否将其限制为 2000 个字符以使其适合数据库中的 nvarchar(2000) 列?否则,可能只允许 2% 的溢出在 Java 端是灵活的。

Java 应该使用 Unicode UTF16 来表示字符串。 /r 一定是在其他地方进入的,也许是提交时在网络浏览器中的转换?你试过不同的浏览器吗?在不同的平台上?你可能只需要去掉/rs。

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 注意:代码应为textarea.value.replace(/\n/g, "\n\r").length 以查找所有匹配项。原始代码只查找第一个匹配项。
    • 应该是"\r\n",而不是"\n\r"
    • 要记住正确的顺序是\r\n,记住\r代表回车(Cr)和\n代表@中的(新)换行(Lf) 987654330@.
    • 我认为您需要在客户端和服务器上进行行尾转换/检查,因为您不知道客户端浏览器将使用什么行尾(即使在 Windows 上,Firefox 也会提交 \n)如果您在 Windows 上开发服务器端并在 Linux 上部署,那么行尾的处理方式将有所不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-12-23
    • 1970-01-01
    相关资源
    最近更新 更多