【问题标题】:Do browsers send "\r\n" or "\n" or does it depend on the browser?浏览器发送“\r\n”或“\n”还是取决于浏览器?
【发布时间】:2011-09-13 12:41:00
【问题描述】:

这个问题困扰了我一百万年......每当我创建一个带有允许多行的文本区域的网站(例如用户个人资料的“Bio”)时,我总是最终编写以下偏执代码:

// C# code sample...
bio = bio.Replace("\r\n", "\n").Replace("\r", "\n");
bio = Regex.Replace(@"\n{2,}", "\n\n");

那么,如果<textarea name="Bio"></textarea> 有多行,浏览器会发送什么?

【问题讨论】:

  • 哇,我以为这是一个奇怪的问题,不会引起任何关注……但是 1 小时内获得了 16 票,太疯狂了。
  • 想一想,我从来没有遇到过与此相关的问题。如果有人输入换行符,它会在所有操作系统、MySQL 客户端、浏览器等中显示为换行符。看起来这意味着大多数软件对这个问题都有一些一致的看法。当然,如果我要用它做一些重要的事情,我总是会正常化。
  • 如果我依赖“\r\n”,然后正在构建用户简历的“HTML 格式”版本,问题就会出现,因为我从未遇到过“\r\ n",我将它们全部归为一个 <p> 标签。

标签: html browser web-standards line-breaks


【解决方案1】:

HTTPMIME 规范指定标题行必须以 \r\n 结尾,但它们并不清楚(有些人会争辩说如果它们清楚则不清楚)如何处理TEXTAREA 的内容。 (例如,请参阅来自 HTML 工作组的 this thread 关于该问题。)

以下是 HTTP/1.1 规范中关于消息头的引用:

消息头字段的行终止符是序列 CRLF。但是,我们建议应用程序在解析此类标头时,将单个 LF 识别为行终止符并忽略前导 CR。

我认为总的来说这是一个很好的策略:严格控制你生产的东西,但对你接受的东西放宽。您应该假设您将收到各种线路终止符。 (请注意,除了 CRLF 和 LF,Mac OS-9 单独使用 CR,周围还有一些。Unicode standard(第 5.8 节)指定了应被识别为行终止符的广泛字符序列; 有一个他们的列表here。)

【讨论】:

  • 我不相信规范指定 textarea 产生的内容。
  • @Will:再次阅读原始问题。它特别询问浏览器如何编码 textarea 的内容(这是规范或至少 Ted 引用的部分没有限制的内容)。
  • @Mark - 你是对的。在各种论坛上,关于这个问题的争论无休无止。 (请参阅 HTML 工作组的 this thread from 1995
  • 这个答案需要编辑。它开始引用 HTTP 规范,但这与 textareas 无关。
  • 我做了,但答案仍然从引用 HTTP 开始,如果提到的话,这是一个错误的规范。您包含的报价专门针对“消息头字段”,但textareas 不会作为消息头字段发送。 textareas 被编码到不同的消息体中。
【解决方案2】:

如果<textarea></textarea> 有多行,浏览器会发送什么?

所有现代浏览器都发送 CRLF (\r\n)。然而,这还没有得到令人满意的标准化,所以我肯定认为值得标准化所有多行输入文本的换行符。

当值是通过 JavaScript 读取而不是直接从表单提交时,浏览器的行为会有所不同。 IE 和 Opera 返回带有 CRLF 的字符串; Firefox 和 WebKit 返回 LF。因此,使用 JavaScript/XMLHttpRequest 帮助提交的任何表单都可能以任何一种形式出现。

【讨论】:

  • JavaScript 在跨平台的任何特定浏览器上的行为是否一致? (例如,Firefox 在 Windows、Mac 和移动平台上是否返回带有 LF 的字符串?)
  • @Ted:这种行为在 Firefox、Opera 和 WebKit 的平台上是一致的。 IE5/Mac 我没有测试过,因为它已经死了很久了,但是那个浏览器和 IE5/Win 有很多不同。
猜你喜欢
  • 1970-01-01
  • 2013-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
相关资源
最近更新 更多