【问题标题】:HTML CDATA issueHTML CDATA 问题
【发布时间】:2013-04-14 18:39:38
【问题描述】:

我正在使用 Java,我有这个例子:

http://jsfiddle.net/uAQ94/1/

但是当我想显示最终的 HTML 时,我看不到 CDATA 标记包围的特殊字符。 例如:

<![CDATA[à]]  not show the à character

我需要理解这一点,因为我必须执行这段代码:

    try {
        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(new StringBufferInputStream(escapedStr));
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocument(doc, null);
        renderer.layout();
        OutputStream os = response.getOutputStream();
        renderer.createPDF(os);
        os.close();
    } catch (Exception ex) {
        ex.printStackTrace();
    }

获取pdf页面。

为什么 CDATA 不显示任何特殊字符?

【问题讨论】:

  • 你为什么首先在那里使用 CDATA 部分?

标签: java html xml cdata


【解决方案1】:

在 HTML 中,CDATA 部分只能出现在 foreign XML elements 内,而且只能出现在相对现代的浏览器上。

Section 12.1.5

CDATA 部分只能用于外来内容(MathML 或 SVG)。

CDATA 部分也存在问题,因为没有简单的方法来呈现其值包含字符串 "]]&gt;" 的 CDATA 部分。

出于这两个原因,大多数 HTML 渲染器会将 CDATA 部分转换为常规实体转义文本节点。


<p>
  <![CDATA[à]]>
  <![CDATA[ò]]>
  <![CDATA[è]]>+
  <![CDATA[ì]]>
</p>

这些 CDATA 部分不在外部 XML 中。它们位于常规 HTML &lt;p&gt; 元素内,因此不允许使用。

避免这些重音元音的编码问题的最简单方法是使用 HTML 数字字符引用:

<p> &#224; &#242; &#232;+ &#236; </p>

应该与您的原始版本等效(标准化后)。

【讨论】:

  • 指定重音元音的最佳方法是使用支持它们的字符编码……无论它们是否出现在 CDATA 部分中,您都必须这样做。使用数字字符引用只会使源代码很难阅读。
  • @Quentin,我同意可读性,但有时您无法控制提供 HTML 的内容类型标头。例如,当生成 HTML 的 sn-ps 时,它只能出现在正文中(没有 &lt;meta&gt;)或作为 HTML 转义符的一部分。在这种情况下,产生 7 位拉丁文输出可能是最好的互操作方式。我认为 OP 尝试像 CDATA 部分这样的技巧的原因是因为它们存在某种编码互操作问题。
  • 我同意@Quentin,使用正确的编码(可能是UTF-8),你不必担心特殊字符,见setXMLEncoding
  • @lolotron,正如我在对 Quentin 的回复中提到的,只有在您知道或可以控制所使用的编码时才有效。不这样做的代码(通常是库代码)必须做出最坏情况的假设。
  • 嘿@MikeSamuel 我是HTML5这个主题的专家,但是你说forgein element是什么意思?可以 MathMlL 吗?或类似的东西?你能告诉我更好地理解你吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 2012-07-18
相关资源
最近更新 更多