Firefox和Chrome在POST期间将LF替换为CR+LF
Firefox and Chrome replacing LF with CR+LF during POST
为什么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是除"实体体"之外的所有内容的行结束符,而"实体体"不包含参数。
<textarea>
元素值中剥离返回字符,但他们在发布时将CR放回。这意味着想要做像Stackoverflow注释"字符计数器"行为的代码必须考虑到这样一个事实,即发布的字符数不一定与"value"属性值中的字符数相同。
最后,值得注意的是,jQuery规范了浏览器行为,并确保<textarea>
元素总是的".val()"响应没有CR字符,使得所有浏览器的都是错误的:-)
编辑本;实际上,在研究RFC后,可能会发现在POST请求中,参数部分被认为是"实体体"。如果是这样,浏览器转换为CR-LF可能只是为了保守。服务器应该是非常灵活的行终止约定,但也许10年前他们没有,浏览器只是做了一件简单的事情,发送一个标准化的CR-LF对以确保安全。
还请注意IE也总是这样做,但不同之处在于IE中<textarea>
的值总是以CR字符完整的方式报告。
相关文章:
- 无法从 jQuery RSS Feed 中的 localStorage 动态替换类
- 我如何找到一个句子中的所有空格并替换忽略它们
- 如何用更合适的内容替换document.write
- 是否有任何方法可以使用jQuery替换在数组中定义值的文本
- 在DOM中查找一个模式并替换它's的内容使用jquery
- 用空格替换下划线PHP
- str.split(someString).join(someOtherString)是否等效于替换
- 使用javascript的图像替换循环
- window.location替换并传递URL历史记录条目中的变量
- 替换标记中的属性
- 指令的模板必须只有一个根元素:With restrict E&替换true
- AngularJs对ng消息的自定义替换
- 用超链接替换URLS
- 用cdata标记替换脚本标记
- Javascript对象类在单击时打开窗口进行颜色选择,并在更改时替换对象背景颜色
- 在javascript中,I'我很难弄清楚如何让regex只替换捕获而不替换匹配
- 替换url中变量的值
- 我希望在不替换现有变量的情况下恢复localStorage中的变量
- Firefox和Chrome在POST期间将LF替换为CR+LF
- 仅替换同时具有“CRLF”和“LF”行分隔符的字符串中的“CRLF”