11

XHTML5 是否支持字符实体,例如 —. 在工作中,我们可能需要特定的软件来访问站点的管理端,并且人们需要多文件上传。对我来说,这是一个需要迁移到 FF 3.6+ 的简单理由,所以我会尽快完成。我们目前使用 XHTML 1.1,在迁移到 HTML5 后,我遇到字符实体名称的问题……有人有这方面的文档吗?

我看到WHATWG规范上有一个列表,但我不确定它是否会影响作为application/xhtml+xml. 无论如何,Chromium nightly 和 FF 3.6 中提到的两个触发错误。

4

5 回答 5

13

XHTML5 没有 DTD,因此 XML 解析器将看不到实体定义(预定义的除外)。如果你想使用一个实体,你必须在内部子集中自己定义它。

<!DOCTYPE html [
    <!ENTITY mdash "—">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
    ... &mdash; ...
</html>

(当然,如果您将text/html内部子集作为 .

HTML5 wiki当前推荐:

不要在 XHTML 中使用实体引用(5 个预定义实体除外:&amp;&lt;&gt;和)&quot;&apos;

我同意这个建议,不仅适用于 XHTML5,而且适用于一般的 XML 和 HTML。今天几乎没有理由将 HTML 实体用于任何事情。直接键入的 Unicode 字符对每个人来说都更具可读性,并且&#...;当您不能保证 8 位/编码干净的传输时,字符参考可用于那些悲伤的情况。(由于没有为大多数 Unicode 字符定义 HTML 实体,因此无论如何您都将需要这些实体。)

于 2010-07-09T17:57:57.647 回答
6

我需要对可能的 HTML 5 进行 XML 验证。HTML 4 和 XHTML 只有 250 个左右的普通实体,而当前的草案(2012 年 1 月)有 2000 多个。

GET 'http://www.w3.org/TR/html5-author/named-character-references.html' |
xmllint --html --xmlout --format --noent - | 
egrep '<code|<span.*glyph' |  # get only the bits we're interested in
sed -e 's/.*">/__/' | # Add some "__" markers to make e.g. whitespace
sed -e 's/<.*/__/' |  #  entities work with xargs
sed 's/"/\&quot;/' | # xmllint output contains " which messes up xargs
sed "s/'/\&apos;/" | # ditto apostrophes. Make them HTML entities instead.
xargs -n 2 echo |  # Put the entity names and values on one line
sed 's/__/<!ENTITY /' | # Make a DTD
sed 's/;__/ /' |
sed 's/ __/"/'  |
sed 's/__$/">/' |
egrep -v '\bapos\b|\bquot\b|\blt\b|\bgt\b|\bamp\b' # remove XML entities.

您最终会得到一个包含 2114 个实体的文件。

<!ENTITY AElig "&#xC6;">
<!ENTITY Aacute "&#xC1;">
<!ENTITY Abreve "&#x102;">
<!ENTITY Acirc "&#xC2;">
<!ENTITY Acy "&#x410;">
<!ENTITY Afr "&#x1D504;">

将其插入 XML 解析器应该允许 XML 解析器解析这些字符实体。

2012 年 10 月更新:由于工作草案现在有一个 JSON 文件(是的,我仍在使用正则表达式),我将其简化为一个 sed:

curl -s 'http://www.w3.org/TR/html5-author/entities.json' |
sed -n '/^  "&/s/"&\([^;"]*\)[^0-9]*\[\([0-9]*\)\].*/<!ENTITY \1 "\&#\2;">/p' |
uniq

当然,等效的 javascript 会更加健壮,但并不是每个人都安装了节点。每个人都有sed,对吧?随机样本输出:

<!ENTITY subsetneqq "&#10955;">
<!ENTITY subsim "&#10951;">
<!ENTITY subsub "&#10965;">
<!ENTITY subsup "&#10963;">
<!ENTITY succapprox "&#10936;">
<!ENTITY succ "&#8827;">
于 2012-01-25T14:00:56.410 回答
2

正确答案(现代方式)

五年前我问过这个问题。现在每个浏览器都支持 UTF-8。而且,UTF-8 的每一次开始都包括对所有命名字符实体的字形支持。这个问题的当前最正确的解决方案是根本不使用命名实体,而是提供UTF-8(严格)并在其中使用实际字符。

这是所有 XML 实体的列表。所有这些都有 UTF-8 字符替代 - 这就是它们通常的呈现方式。

例如,采取

U+1D6D8, MATHEMATICAL BOLD SMALL CHI            , b.chi

我想在某些 xml 变体中,您可能拥有&b.chi或其他东西,搜索MATHEMATICAL BOLD SMALL CHI您会在 fileformat.info 上找到一些页面,其中列出了字符。

或者,在 Windows 中,您可以键入Alt+ 1 D 6 D 8(1d68d 来自 XML 实体表),或者在 Linux中键入Ctrl+ Shift+ u 1 D 6 D 8

这将以正确的方式将角色放入您的文档中。

于 2015-12-03T18:50:58.033 回答
1

我最好的建议是在提供对字符实体名称的支持之前不要升级到 HTML5 或 XHTML5。

任何认为这比需要大脑升级&#12345;更有意义的人。&mdash;大多数人不记得巨大的数字表。

我们这些必须继续使用旧操作系统才能与现有科学、实时或销售点硬件(或政府网络)兼容的人不能只键入字符或从列表中选择字符。它不会正确保存在文件中。

强加给我们的原因是 w3c 不再需要提供服务 DTD 文件的费用,所以我们必须回到石器时代。

任何已经提供的类似的东西都不应该被弃用。

于 2015-12-03T15:00:47.303 回答
0

使用以下答案:https ://stackoverflow.com/a/9003931/689044 ,我创建了文件并将其作为 Gist 发布在 GitHub 上:https : //gist.github.com/cerkit/c2814d677854308cef57需要文件中的实体。

我通过将文本文件加载到应用程序对象中并将该值与我的(格式正确的)HTML 一起使用来解析 System.Xml.XmlDocument,从而成功地将它与 ASP.NET MVC 一起使用。

XmlDocument doc = new XmlDocument();

// load the HTML entities into the document and add a root element so it will load
// The HTML entities are required or it won't load the document if it uses any entities (ex: &ndash;)
doc.LoadXml(string.Format("{0}<root>{1}</root>", Globals.HTML_ENTITIES, control.HtmlText));
var childNodes = doc.SelectSingleNode("//root").ChildNodes;
// do your work here    
foreach(XmlNode node in childNodes)
{
    // or here
}

Globals.HTML_ENTITIES 是一个静态属性,它从文本文件加载实体并将它们存储在 Application 对象中,或者如果它们已经加载到 Application 对象中,它会使用这些值。

public static class Globals
{   
    public static readonly string APPLICATION_KEY_HTML_ENTITIES = "HTML_ENTITIES";

    public static string HTML_ENTITIES
    {
        get
        {
            string retVal = null;
            // load the HTML entities from a text file if they're not in the Application object
            if(HttpContext.Current.Application[APPLICATION_KEY_HTML_ENTITIES] != null)
            {
                retVal = HttpContext.Current.Application[APPLICATION_KEY_HTML_ENTITIES].ToString();
            }
            else
            {
                using (StreamReader sr = File.OpenText(HttpContext.Current.Server.MapPath("~/Content/HtmlEntities/RootHtmlEntities.txt")))
                {
                    retVal = sr.ReadToEnd();
                    HttpContext.Current.Application[APPLICATION_KEY_HTML_ENTITIES] = retVal;
                }
            }

            return retVal;
        }
    }
}

我尝试创建一个长字符串来保存这些值,但它不断使 Visual Studio 崩溃,因此我决定最好的方法是在运行时加载文本文件并将其存储在 Application 对象中。

于 2015-05-19T21:15:29.280 回答