XHTML5是否支持
和—
等字符实体。在工作中,我们可以要求特定的软件访问网站的管理员端,人们要求多文件上传。对我来说,这是一个很容易理由要求迁移到FF 3.6+,所以我很快就会这样做。我们目前使用的是XHTML 1.1,在转移到HTML5时,我只有字符实体名称的问题......有没有人有这方面的文档?
我看到WHATWG规范中有一个列表,但我不确定它是否会影响作为application/xhtml+xml
的文件。无论如何,两个提到的Chromium nightly和FF 3.6都有触发错误。
答案 0 :(得分:12)
XHTML5没有DTD,因此XML解析器将看不到任何实体定义(除了预定义的定义)。如果您想使用实体,则必须在内部子集中为自己定义它。
<!DOCTYPE html [
<!ENTITY mdash "—">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
... — ...
</html>
(当然,如果您将浏览器作为text/html
提供给浏览器,则使用内部子集可能会使浏览器跳闸。不允许在非XHTML HTML5文档中发送内部子集。)
HTML5 wiki目前建议:
不要在XHTML中使用实体引用(5个预定义实体除外:
&
,<
,>
,"
和'
)
我同意这个建议,不仅适用于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/"/\"/' | # xmllint output contains " which messes up xargs
sed "s/'/\'/" | # 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 "Æ">
<!ENTITY Aacute "Á">
<!ENTITY Abreve "Ă">
<!ENTITY Acirc "Â">
<!ENTITY Acy "А">
<!ENTITY Afr "𝔄">
将其插入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 "⫋">
<!ENTITY subsim "⫇">
<!ENTITY subsub "⫕">
<!ENTITY subsup "⫓">
<!ENTITY succapprox "⪸">
<!ENTITY succ "≻">
答案 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。
任何认为〹
比—
更有意义的人都需要进行大脑升级。大多数人都记不住那些庞大的数字表。
我们这些不得不继续使用旧操作系统与现有科学,实时或销售点硬件(或政府网络)兼容的人不能只输入字符或从列表中选择它。它无法在文件中正确保存。
对我们强加的原因是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: –)
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对象中。