我将这个简单的测试页保存为page1.html。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<script type="text/javascript">
function submitForm() {
alert(escape(document.myform.mytextarea.value));
return true;
}
</script>
</head>
<body>
<form name="myform" action="page2.html" method="post" onsubmit="javascript:return submitForm();">
<textarea name="mytextarea">xxxyyy</textarea>
<input type="submit" value="submitForm">
</form>
</body>
</html>
此页面保存为page2.html。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<body>
Page2.html
</body>
</html>
我在Firefox下打开page1.html(我认为版本没有重要性,但它是18.0。与Chrome或IE 10.0相同的问题)。 在我单击submitForm按钮之前,我在值“xxx”和“yyy”之间点击了一个ENTER。
当我单击submitForm按钮时,警报显示“xxx”和“yyy”之间的一个字符,即\ n编码为“%0A”。
如果我查看Firebug发布的内容,我可以看到两个字符“\ r \ n”编码为“%0D%0A”。
你能解释为什么\ n在POST上转换为\ r \ n以及如何防止这种情况? 我最小化了我的问题,但这对我来说确实存在问题。
我可以在Safari OS上测试这个,在POST时我也会得到%0D%0A。
在IE 8.0及之前,Javascript警告%0D%0A,我在POST时获得%0D%0A,因此IE 8.0及之前的行为不同。
答案 0 :(得分:0)
对于不同的操作系统,新行字符的处理方式不同。
\ r = CR(回车)//用作Unix中的新行字符
\ n = LF(换行)//在Mac OS中用作换行符
\ r \ n = CR + LF //用作Windows中的新行字符
就文本区域的数据而言。提交表单后,文本区域内容将按照HTML Spec:
进行网址编码换行符与多行文本字段值一样,表示为CR LF对,即`%0D%0A'。
我找到了一个相关的SO Question来解决与换行和跨平台兼容性类似的问题。
就您的问题而言,如果您想要统一处理新行,您可以在文本区域的内容中进行简单的正则表达式替换以处理差异。
答案 1 :(得分:0)
感谢您的信息,我写了这个函数来计算我的textarea在任何浏览器上的“提交”长度:
function getFormURLEncodedLength(myValue) {
return myValue.replace(/(\r\n|\n|\r)/g, '\r\n').length;
}
答案 2 :(得分:0)
在c#中:
string value = Request.Params["txtValue"].replace("\r\n","\n");
或者您可以添加隐藏字段,如:
<input id="txtValue" type="textarea" />
<input id="hiddenTxtValue" type="hidden"/>
并使用encodeUriComponent
设置其值:
$('#hiddenTxtValue').val(encodeUriComponent($('#txtValue').val()));
在c#中:
string value = Request.Params["hiddenTxtValue"];