浏览器是否发送“ \ r \ n”或“ \ n”,还是取决于浏览器?


102

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

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

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


哇,我认为这是一个奇怪的问题,不会引起任何注意...但是疯狂地在一小时内得到了16票。
Timothy Khouri

考虑到这一点,我从未遇到过与此相关的问题。如果有人输入换行符,它将在所有操作系统,MySQL客户端,浏览器等中显示为换行符。看起来这意味着大多数软件对此都有一定的统一性。当然,如果我要对其做一些重要的事情,我总是将其标准化。
HalilÖzgür11年

如果我依靠“ \ r \ n”,然后构建用户的Bio的“ HTML格式”版本,就会出现问题,并且由于我从没有碰过“ \ r \ n”,所以我将其全部一个<p>标签。
蒂莫西·库里

Answers:


50

HTTPMIME规范指定标题行必须以\ r \ n结束,但他们并不清楚(有些人会认为,如果他们都清楚,目前还不清楚)有关如何与textarea的内容做。(参见,例如,这个线程从HTML工作组有关的问题。)

这是HTTP / 1.1规范中有关消息头的引文:

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

我认为这通常是个好策略:对您的产品严格要求,但对接受的要求要宽松。您应该假定您将收到各种行终止符。(请注意,除了CRLF和LF之外,Mac OS-9单独使用CR,并且周围还有一些。Unicode标准(第5.8节)指定了应被视为行终止符的各种字符序列;有它们的列表在这里。)


6
我不认为这些规范指定了textarea产生的内容。
马克·托马斯

2
@Will:再次阅读原始问题。它专门询问浏览器如何对a的内容进行编码textarea(这是规范或至少Ted引用的部分不受约束的内容)。
John Bartholomew

2
@Mark-你是对的。在各个论坛中都有关于该问题的无休止的辩论。(见1995年这个线程从HTML工作组。
泰德·霍普

2
该答案需要编辑。它从引用HTTP规范开始,但与textareas无关。
DuckMaestro 2011年

2
我确实做到了,但是答案仍然始于引用HTTP,这是完全错误的规范,如果提及的话。包含的引号专门解决“消息头字段”,但textarea不会将s作为消息头字段发送。textarea被编码到不同的消息主体中。
DuckMaestro 2011年

30

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

所有现代浏览器都发送CRLF(\r\n)。但是,这还没有得到令人满意的标准化,因此我绝对认为有必要对所有多行输入文本的换行进行规范化。

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


JavaScript在跨平台的任何特定浏览器上是否表现一致?(例如,Firefox是否在Windows,Mac和移动平台上返回带有LF的字符串?)
Ted Hopp

1
@Ted:此行为在Firefox,Opera和WebKit的各个平台上都是一致的。我尚未测试过IE5 / Mac,因为它已经死了很长时间,但是该浏览器与IE5 / Win有很多差异。
bobince 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.