新线和浏览器/操作系统兼容性

时间:2009-06-03 17:14:10

标签: java browser newline

我有一个接受值列表的表单,每个值都列在textArea的单独行中。在我的Servlet中,我根据新的行字符“\ r \ n”来标记我从textArea接收到的字符串,如下所示:

String[] partNumberList = originalPartNumberString.split("\r\n");

这似乎工作正常。我按预期获得了一系列值。我相信这是因为浏览器处理标准化新行发送到服务器的方式,无论表单数据从哪个OS /浏览器发送(see this post)。我已经在IE,Firefox,Chrome中进行了测试......一切看起来都很好用,我对此非常有信心。

在服务器端接收到值后,我会将这些值用于某些查找等,然后我将它们写回textArea以获取响应。为了做到这一点,我正在以与我收到它相同的方式写回来...我只是构建一个新的String,并用“\ r \ n”分隔每个值。然后我将textArea的值设置为该String。

StringBuffer invalidReturnPartList = new StringBuffer("");

for (int i = 0; i < requestedPartList.length; i++)
{
    invalidReturnPartList.append(requestedPartList[i]);
    invalidReturnPartList.append("\r\n");
}

return invalidReturnPartList.toString();

在我尝试的所有浏览器中,这也适用于我。但是,我只是担心我是否覆盖了我的所有基础...如果有人在运行Mac,那么“\ r \ n”会在浏览器上正确翻译吗? Linux怎么样?我认为一切都会在浏览器中处理,但我不确定这里...所以我的问题是,这看起来对你来说,还是我错过了什么?

2 个答案:

答案 0 :(得分:3)

我打算在这里回答我自己的问题。

由于textArea的值是表单数据,并且表单以内容类型“application / x-www-form-urlencoded”提交给服务器,因此新行将被浏览器转换为“CR LF”根据HTML规范提交到服务器(请参阅http://www.w3.org/MarkUp/html-spec/html-spec_8.html#SEC8.2.1)。

因此,在这种情况下,无论浏览器或操作系统如何,我的代码都应该始终如一。

但是,如果我试图在客户端实现相同的代码(比方说,使用JavaScript),也许在提交之前验证表单......这可能是一个不同的故事。由于此时表单数据尚未规范化,因此很可能取决于平台/浏览器用于新行的任何内容。在这种情况下,我可能不仅要检查“\ r \ n”,还要检查“\ r”和“\ n”。

答案 1 :(得分:2)

如果您查找HTTP协议定义,您会发现:

  

HTTP / 1.1定义了序列CR LF   作为所有的终点标记   协议元素除了   实体 - 体(见附录19.3)   宽容的申请)。该   一个内的行尾标记   entity-body由其定义   相关媒体类型,如中所述   第3.7节。

但这对身体无效。我假设您发送带有帖子请求的表单信息,因此我假设使用了内容类型text / plain,在这种情况下,我认为以下情况适用:

  

3.7.1规范化和文本默认值

     

注册了互联网媒体类型   以规范形式。一个
  通过HTTP传输的实体主体   消息必须在
中表示   适当的规范形式   它的传输除了“文本”   类型,如下所述   段落。

     

当以规范形式,媒体   “text”类型的子类型使用CRLF   作为文本行中断。 HTTP   放宽这个要求并允许   文本媒体的传输   单独的普通CR或LF表示   完成后换行   始终如一   实体主体。 HTTP应用程序必须   接受CRLF,裸CR和裸LF作为   代表一条线   通过HTTP收到的文本媒体中断。

这意味着,浏览器可以向您发送UNIX样式端线。

(两段都来自http://www.ietf.org/rfc/rfc2616.txt