代码之家  ›  专栏  ›  技术社区  ›  JasonStoltz

新品和浏览器/操作系统兼容性

  •  3
  • JasonStoltz  · 技术社区  · 17 年前

    我有一个表单,它接受一个值列表,每个值都列在一行单独的textArea上。在我的Servlet中,我根据新行字符“\r\n”标记从该文本区域接收的字符串,如下所示:

    String[] partNumberList = originalPartNumberString.split("\r\n");
    

    see this post ).我已经在IE,Firefox,Chrome上测试过了。。。这一切似乎都很好,我对此很有信心。

    在服务器端接收到这些值之后,我使用这些值进行一些查找,等等,然后将它们写回textArea以获得响应。为了做到这一点,我正在写回我收到它的方式一样。。。我只是构建一个新字符串,并用“\r\n”分隔每个值。然后我将textArea的值设置为该字符串。

    StringBuffer invalidReturnPartList = new StringBuffer("");
    
    for (int i = 0; i < requestedPartList.length; i++)
    {
        invalidReturnPartList.append(requestedPartList[i]);
        invalidReturnPartList.append("\r\n");
    }
    
    return invalidReturnPartList.toString();
    

    这也可以在我尝试过的所有浏览器中测试OK。然而,我只是担心我是否覆盖了我在这里的所有基础。。。如果有人正在运行Mac,浏览器上的“\r\n”翻译是否正确?Linux呢?我想一切都会在浏览器中处理,但我只是不确定这里。。。所以我的问题是,你觉得这是对的,还是我错过了什么?

    2 回复  |  直到 9 年前
        1
  •  3
  •   JasonStoltz    17 年前

    我想在这里回答我自己的问题。

    由于textArea的值是表单数据,并且表单以内容类型“application/x-www-form-urlencoded”提交给服务器,因此在根据HTML规范提交给服务器之前,浏览器会将新行转换为“CR-LF”(参见 http://www.w3.org/MarkUp/html-spec/html-spec_8.html#SEC8.2.1 ).

    因此,在这种情况下,我的代码应该能够始终如一地工作,而不考虑浏览器或操作系统。

    但是,如果我试图在客户端实现相同的代码(比如说,使用JavaScript),可能是为了在提交之前验证表单。。。这可能是一个不同的故事。由于此时表单数据尚未规范化,因此它很可能取决于平台/浏览器对新行使用的内容。在这种情况下,我可能不仅需要检查“\r\n”,还需要检查“\r”和“\n”。

        2
  •  2
  •   chris166    17 年前

    HTTP/1.1定义了序列CR LF 作为所有行的结束标记
    协议元素,但不包括 实体实体(有关详细信息,请参见附录19.3
    容错应用程序)。这个 行内的行结束标记 实体体由其 关联的媒体类型,如中所述 第3.7节。

    但这对身体是无效的。我假设您通过post请求发送表单信息,因此我假设使用了内容类型text/plain,在这种情况下,我认为以下内容适用:

    3.7.1规范化和文本默认值

    已注册Internet媒体类型 具有标准形式。一
    消息必须在
    适当的标准形 除“文本”外,其传输 类型,如下一节中所定义

    当处于标准形式时,媒体 “文本”类型的子类型使用CRLF 当文本行中断时。超文本传输协议 文本媒体的传输 纯CR或LF单独表示 一以贯之 实体实体。HTTP应用程序必须 接受CRLF、裸CR和裸LF作为 代表某一行的 通过HTTP接收的文本媒体中断。

    (两段均出自 http://www.ietf.org/rfc/rfc2616.txt