【问题标题】:ENTER converted from \n to \r\n on POSTENTER 在 POST 上从 \n 转换为 \r\n
【发布时间】:2014-02-19 13:55:42
【问题描述】:

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

您能解释一下为什么在 POST 上将 \n 转换为 \r\n 以及如何防止这种情况发生吗? 我尽量减少了我的问题,但这对我来说确实是个问题。

我可以在 MAC OS 上的 Safari 下进行测试,并且在 POST 上也得到 %0D%0A。

在 IE 8.0 及之前的版本下,Javascript 会提示 %0D%0A,而我在 POST 时收到 %0D%0A,因此 IE 8.0 及之前的版本表现不一样。

【问题讨论】:

  • 根据您的操作系统,换行符可能只用“\n”或“\r”和“\n”表示,尽管这似乎不是问题在这里。
  • ECMA 脚本标准说“\n for newline”,并且 alert 是 ECMA 脚本。 POST 使用“真实”数据,在您的 windows 机器上是“\r\n”,而在 Macbook 上是“\r”,在 Linux 机器上是“\n”。

标签: javascript html http post http-post


【解决方案1】:

解决方案 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"];

【讨论】:

    【解决方案2】:

    不同操作系统对换行符的处理方式不同。

    \r = CR (Carriage Return) // 在 Unix 中用作换行符

    \n = LF (Line Feed) // 在 Mac OS 中用作换行符

    \r\n = CR + LF // 在 Windows 中用作换行符

    就文本区域中的数据而言。提交表单后,文本区域的内容会按照 HTML Spec:

    进行 url 编码

    与多行文本字段值一样,换行符表示为 CR LF 对,即 `%0D%0A'。

    我找到了一个相关的SO Question,它解决了换行和跨平台兼容性的类似问题。

    就您的问题而言,如果您希望统一处理新行,您可以在文本区域的内容中进行简单的正则表达式替换以解决差异。

    【讨论】:

      【解决方案3】:

      感谢您的信息,我编写了这个函数来计算我的文本区域在任何浏览器上的“提交”长度:

      function getFormURLEncodedLength(myValue) {
        return myValue.replace(/(\r\n|\n|\r)/g, '\r\n').length;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-24
        • 1970-01-01
        • 1970-01-01
        • 2018-02-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多