HTML5和HTML4字符实体

时间:2010-07-09 17:25:22

标签: html-entities html5

XHTML5是否支持 —等字符实体。在工作中,我们可以要求特定的软件访问网站的管理员端,人们要求多文件上传。对我来说,这是一个很容易理由要求迁移到FF 3.6+,所以我很快就会这样做。我们目前使用的是XHTML 1.1,在转移到HTML5时,我有字符实体名称的问题......有没有人有这方面的文档?

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

5 个答案:

答案 0 :(得分:12)

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

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

(当然,如果您将浏览器作为text/html提供给浏览器,则使用内部子集可能会使浏览器跳闸。不允许在非XHTML HTML5文档中发送内部子集。)

HTML5 wiki目前建议:

  

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

我同意这个建议,不仅适用于XHTML5,还适用于XML和HTML。今天没有理由将HTML实体用于任何事情。直接键入的Unicode字符对每个人来说都更具可读性,并且当您无法保证8位/编码 - 清除传输时,&#...;字符引用可用于那些令人遗憾的情况。 (由于HTML实体没有为大多数Unicode字符定义,所以无论如何都需要这些。)

答案 1 :(得分: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;">

答案 2 :(得分:2)

正确答案(现代方式)

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

This is a list of all XML entities。所有这些都有UTF-8字符替代品 - 以及它们通常如何呈现它们。

例如,参加

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

我想在xml的某些变体中你可能有&b.chi或其他东西,搜索MATHEMATICAL BOLD SMALL CHI你会找到some page on fileformat.info,其中列出了个字符

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

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

答案 3 :(得分:1)

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

任何认为&#12345;&mdash;更有意义的人都需要进行大脑升级。大多数人都记不住那些庞大的数字表。

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

对我们强加的原因是w3c不再需要支付DTD文件的费用,所以我们必须回到石器时代。

不应该弃用任何类似的东西。

答案 4 :(得分:0)

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

我通过将文本文件加载到Application对象并将该值与我的(格式良好的)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对象中。