2009-06-03 77 views
3

我有一个表单接受值的列表,每个值被列在一个单独的textArea行。在我的Servlet,我令牌化基础上,新行字符我从TEXTAREA收到字符串“\ r \ n”,就像这样:新行和浏览器/操作系统兼容性

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

这似乎很好地工作。按预期得到一组值。我相信这是因为浏览器处理标准化新行发送到服务器的方式,无论从哪个OS /浏览器发送表单数据(see this post)。我已经在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呢?我认为所有的东西都可以在浏览器中处理,但我只是不确定在这里......所以我的问题是,这看起来是对你还是我错过了什么?

回答

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”。

2

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

HTTP/1.1的序列CR LF 定义为结束线的标记物,除了所有
协议元素 entity-body(请参阅附录19.3中的
宽容应用程序)。如 第3.7节所述, 实体正文中的 行尾标记由其关联的媒体类型定义。

但这不适用于身体。我假设你与发送POST请求的形式的信息,所以我想内容类型text/plain的被使用,并且在这种情况下,我认为有以下应用:

3.7.1规范化和文本缺省

互联网媒体类型以规范形式注册为 。经由HTTP传送的
实体主体 消息必须在之前 其传输除了“文本” 类型
适当规范形式来表示,如在接下来的段落 定义。

当处于规范形式时,“文本”类型的媒体 子类型使用CRLF 作为文本换行符。 HTTP 放松这一要求,并允许 文本媒体的与 平原CR或LF单独传输表示 换行符当它为整个 实体主体完成 一致。HTTP应用程序必须接受CRLF,裸CR和裸LF,因为 代表通过HTTP接收的文本媒体中的行 中断。

这意味着,浏览器向您发送UNIX样式的结束符是可以的。

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

+1

我明白了你的观点。但是,我认为当表单提交时,其提交的内容类型为“application/x-www-form-urlencoded”。 这篇文章(http://stackoverflow.com/questions/760282/do-line-endings-distinctions-apply-for-html-forms)引用了一个文档(http://www.w3.org/MarkUp/html -spec/html-spec_8.html#SEC8.2.1),这似乎意味着当用“application/x-www-form-urlencoded”内容类型提交表单时,换行符总是被“CR LF”取代。 。“在多行文本字段值中,换行符表示为CR LF对,即`%0D%0A'。” – JasonStoltz 2009-06-03 18:13:48