在POST上,ENTER从\ n转换为\ r \ n

时间:2014-01-28 10:14:48

标签: javascript html http post http-post

我将这个简单的测试页保存为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。

HTML Form

当我单击submitForm按钮时,警报显示“xxx”和“yyy”之间的一个字符,即\ n编码为“%0A”。

Javascript Alert

如果我查看Firebug发布的内容,我可以看到两个字符“\ r \ n”编码为“%0D%0A”。

Firebug POST

你能解释为什么\ n在POST上转换为\ r \ n以及如何防止这种情况? 我最小化了我的问题,但这对我来说确实存在问题。

我可以在Safari OS上测试这个,在POST时我也会得到%0D%0A。

在IE 8.0及之前,Javascript警告%0D%0A,我在POST时获得%0D%0A,因此IE 8.0及之前的行为不同。

3 个答案:

答案 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)

解决方案1:

在c#中:

string value = Request.Params["txtValue"].replace("\r\n","\n");

解决方案2:

或者您可以添加隐藏字段,如:

<input id="txtValue" type="textarea" />
<input id="hiddenTxtValue" type="hidden"/>

并使用encodeUriComponent设置其值:

$('#hiddenTxtValue').val(encodeUriComponent($('#txtValue').val()));

在c#中:

string value = Request.Params["hiddenTxtValue"];