Firefox和Chrome在POST期间将LF替换为CR+LF

Firefox and Chrome replacing LF with CR+LF during POST

本文关键字:LF 替换 CR+LF Chrome POST Firefox      更新时间:2023-09-26

为什么Firefox和Chrome在POST过程中将LF字符替换为CR+LF ?

我写了下面的测试:

<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.js"></script>
<script type="text/javascript">
function lftest()
{
    var linefeed = "before";
    linefeed += String.fromCharCode(10); //linefeed
    linefeed += "after";
    $("#field").val(linefeed);
    $("#formthing").submit();
}
</script>
</head>
<body>
<form id="formthing" method="post" action="http://someurl.com/resource">
<input type="hidden" id="field" value="" name="line" />
<a href="#" onclick="lftest()">send</a>
</form>
</body>
</html>

开发人员工具网络选项卡显示POST数据:

before%0D%0Aafter

原来这与x-www-form-urlencoded编码类型有关。根据规格:

非字母数字字符由'%HH'、百分号和代替两个十六进制数字,表示字符的ASCII码。换行符表示为"CR LF"对(即'%0D%0A')。

edit一定要阅读@pepsi的深刻评论-以下可能都是假的:-)


这是因为HTTP协议规定,CR-LF是除"实体体"之外的所有内容的行结束符,而"实体体"不包含参数。

因此,更有趣的问题是,为什么Firefox(和Chrome?)不确定)在响应DOM元素的"value"属性的请求时从<textarea>元素值中剥离返回字符,但他们在发布时将CR放回。这意味着想要做像Stackoverflow注释"字符计数器"行为的代码必须考虑到这样一个事实,即发布的字符数不一定与"value"属性值中的字符数相同。 最后,值得注意的是,jQuery规范了浏览器行为,并确保<textarea>元素总是的".val()"响应没有CR字符,使得所有浏览器的都是错误的:-)

编辑本;实际上,在研究RFC后,可能会发现在POST请求中,参数部分被认为是"实体体"。如果是这样,浏览器转换为CR-LF可能只是为了保守。服务器应该是非常灵活的行终止约定,但也许10年前他们没有,浏览器只是做了一件简单的事情,发送一个标准化的CR-LF对以确保安全。

还请注意IE也总是这样做,但不同之处在于IE中<textarea>的值总是以CR字符完整的方式报告。