【问题标题】:Uses for the '"' entity in HTML用于 HTML 中的 '"' 实体
【发布时间】:2014-11-13 01:06:57
【问题描述】:

我正在修改由另一方创作的一些 XHTML 文件。作为这项工作的一部分,我正在通过 Linq to XML 进行一些批量编辑。

我刚刚注意到一些原始 XHTML 源文件在这些文件的文本节点中包含 " HTML entity。例如:

<p>Greeting: &quot;Hello, World!&quot;</p>

当通过XElement.ToString()恢复XHTML文本时,&amp;quot;实体被普通双引号取代:

<p>Greeting: "Hello, World!"</p>

问题:谁能告诉我原作者使用&amp;quot; 实体而不是普通双引号的动机是什么?这些实体是否有我不完全理解的目的?或者,它们真的像我怀疑的那样没有必要吗?

我明白 &amp;quot; 在某些情况下是必要的,例如当需要在 HTML 属性中放置双引号时。例如:

<a href="/images/hello_world.jpg" alt="Greeting: &quot;Hello, World!&quot;">
  Greeting</a>

【问题讨论】:

标签: html xhtml escaping linq-to-xml html-entities


【解决方案1】:

这可能是因为他们使用单个函数来转义属性和文本节点。 &amp;amp; 不会造成任何伤害,那么为什么要让您的代码复杂化并通过有两个转义函数并且必须在它们之间进行选择来使其更容易出错呢?

【讨论】:

    【解决方案2】:

    正如其他答案所指出的,它很可能是由某些工具生成的。

    但如果我是该文件的原作者,我的答案是:一致性

    如果我不允许在我的属性中加上双引号,为什么要把它们放在元素的内容中?为什么这些规格总是有这些例外情况.. 如果我必须编写 HTML 规范,我会说All double quotes need to be encoded。完成。

    今天就像In attribute values we need to encode double quotes, except when the attribute value itself is defined by single quotes. In the content of elements, double quotes can be, but are not required to be, encoded.(我肯定会忘记这里的一些案例)。

    双引号是规范的关键字,对它们进行编码。 小于/大于规范的关键字,对它们进行编码。等等。

    【讨论】:

      【解决方案3】:

      根据我的经验,这可能是基于字符串的工具自动生成的结果,作者不了解 HTML 的规则。

      当一些开发人员在不使用特殊的面向 XML 的工具的情况下生成 HTML 时,他们可能会尝试通过采用 所有内容都必须转义的方法来确保生成的 HTML 是有效的。

      参考您的示例," 的每次出现都由 &amp;quot; 表示的原因可能是因为使用这种方法,您可以安全地在属性和值中使用此类“特殊”字符。

      我看到的另一个动机是人们相信,“我们必须明确表明我们的符号不是语法的一部分。”然而,可以通过使用适当的字符串操作工具来创建有效的 HTML,请再次参阅上一段。

      这里有一些基于 C# 的伪代码,尽管最好使用有效的方法和工具:

      public class HtmlAndXmlWriter
      {
          private string Escape(string badString)
          {
              return badString.Replace("&", "&amp;").Replace("\"", "&quot;").Replace("'", "&apos;").Replace(">", "&gt;").Replace("<", "&lt;");
      
          }
      
          public string GetHtmlFromOutObject(Object obj)
          {
              return "<div class='type_" + Escape(obj.Type) + "'>" + Escape(obj.Value) + "</div>";    
      
          }
      
      }
      

      这种生成 HTML 的方法非常普遍。

      【讨论】:

      • 嗯,如果不使用专门的面向 XML 的工具,通常无法区分 surround 属性值的引号和可能出现在 within 属性值。
      • 不,看到这样的东西: void SerializeAsXml( MyStructure obj, TextWriter out) { out.WriteLine(""); out.WriteLine(""+escaped(obj.Value)+"开始>");猜猜什么是 "escaped(str)->str" )) - 面向字符串的工具总是这样不漂亮的东西......
      • 是的,我明白了!在您的示例中,生成 HTML 的代码正在转义only every 属性的值。也就是说,escaped() 是你自己的转义函数吗?或者来自诸如 .NET Framework 之类的库的内容? (我鼓励您将代码示例合并到您的答案中。)
      • 这只是一个糟糕的代码示例,用 C# 编写,因为它是我的主要语言。在 PHP、Python、Java、C#、C、Erlang 和 LISP 中安装此类编码 ))) 。虽然有大量足够的模块可以很好地完成它(在 .NET 中它是 XElement 系列,例如。)但是糟糕的代码是永远的事情。它尤其存在于不同的页面生成器和 mvc-views 引擎中——它们进行这种转义是为了不介意有效的结构。
      【解决方案4】:

      原因 #1

      有一点,HTML/XHTML 渲染器的错误/延迟实现比正确实现的更常见。许多年前,由于在 HTML/XHTML 文档的常规文本内容中使用未编码的引号字符,我经常在主流浏览器中遇到渲染问题。尽管 HTML 规范从未禁止在文本内容中使用这些字符,但无论如何对它们进行编码已成为相当标准的做法,以便不符合规范的浏览器和其他处理器可以更优雅地处理它们。结果,许多“老前辈”可能仍然条件反射地这样做。这不是错误的,尽管现在可能没有必要,除非您针对的是一些非常过时的平台。

      原因 #2

      当动态生成 HTML 内容时,例如,通过使用来自数据库的简单字符串值填充 HTML 模板,有必要在将每个值嵌入到生成的内容之前对其进行编码。一些常见的服务器端语言为此目的提供了一个函数,该函数只是对 HTML 文档中 some 上下文中 可能 无效的所有字符进行编码。值得注意的是,PHP 的htmlspecialchars() 函数就是这样一个例子。尽管htmlspecialchars() 有一些可选参数会导致它忽略引号,但这些参数过去(并且现在)很少被基本模板驱动系统的作者使用。结果是所有“特殊字符”在生成的 HTML 中出现的任何地方都被编码,而不考虑它们出现的上下文。同样,这并没有错,只是没有必要。

      【讨论】:

        【解决方案5】:

        要知道在元素内容中使用&amp;quot; 的动机是不可能也没有必要的,但可能的动机包括:对HTML 规则的误解;使用生成此类代码的软件(可能是因为其作者认为它“更安全”);以及对&amp;quot; 含义的误解:许多人似乎认为它会产生“智能引号”(他们显然从未看过实际结果)。

        无论如何,在 HTML(XHTML 或任何其他 HTML 版本)的元素内容中永远不需要使用 &amp;quot;。任何 HTML 规范中都没有任何内容可以为那里的纯字符 " 赋予任何特殊含义。

        正如问题所说,它在属性值中发挥了作用,但即使在它们中,如果值包含双引号,则仅使用单引号作为分隔符更简单,例如alt='Greeting: "Hello, World!"' 或者,如果允许您更正自然语言文本中的错误,请使用正确的引号,例如alt="Greeting: “Hello, World!”"

        【讨论】:

        • 有趣的是,在我正在使用的原始源文件中,出现了Left Double Quotation Mark (&amp;ldquo;)Right Double Quotation Mark (&amp;rdquo;)
        • 252 Character entity references in HTML(和 XHTML 中的 253)的完整列表。
        • 知道为什么 Jekyll 总是使用这些转义的 HTML 符号转换 HTML 正文吗?就像...当我将我的 Tumblr 博客转换为 Jekyll 时,它是这样做的:
          “你成为成功企业家的能力大约是......
        • 我知道这个问题是很久以前提出的,但是如果内容是动态生成的(使用 JS 或其他东西),可能需要使用&amp;quot;。例如:element.innerHTML = "Greeting: &amp;quot;Hello World!&amp;quot;"; 以免断线。当然,现在还有其他方法可以做到这一点(template literals 或单引号),但对于这种情况,这将是一个可行的解决方案。
        • tenía un problema en django template y use el |safe me ayuda gracias。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-27
        • 2011-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-01
        相关资源
        最近更新 更多