3

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

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

这似乎工作正常。我得到了预期的值数组。我相信这是因为浏览器处理标准化换行符发送到服务器的方式,无论表单数据是从哪个操作系统/浏览器发送的(请参阅这篇文章)。我已经在 IE、Firefox、Chrome 中进行了测试……一切似乎都可以正常工作,我对此非常有信心。

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

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 呢?我认为一切都将在浏览器中处理,但我只是不确定这里......所以我的问题是,这对你来说是正确的,还是我错过了什么?

4

2 回答 2

3

我将尝试在这里回答我自己的问题。

由于 textArea 的值是表单数据,并且表单以 Content Type "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”。

于 2009-06-03T18:46:22.443 回答
2

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


HTTP/1.1 将序列 CR LF 定义为除实体主体之外的所有协议元素的行尾标记(有关
宽容的应用程序,请参见附录 19.3)。实体主体内的行尾标记由其关联的媒体类型定义,如 3.7 节所述。

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

3.7.1 规范化和文本默认值

Internet 媒体类型以规范形式注册。通过 HTTP 消息传输的
实体主体必须在
传输之前以适当的规范形式表示,“文本”类型除外,如下一段中定义。

当采用规范形式时,“文本”类型的媒体子类型使用 CRLF 作为文本换行符。HTTP 放宽了这一要求,并允许传输具有纯 CR 或 LF 的文本媒体,当它对整个实体主体一致完成时,它代表一个换行符。HTTP 应用程序必须接受 CRLF、裸 CR 和裸 LF 作为通过 HTTP 接收的文本媒体中的换行符的代表。

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

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

于 2009-06-03T17:49:09.530 回答