Объекты символов XHTML5 и HTML4
Поддерживает ли XHTML5 объекты символов, такие как
и —
. На работе мы можем потребовать специального программного обеспечения для доступа к административной стороне сайта, и люди требуют многофайловой загрузки. Для меня это простое обоснование, требующее перехода на FF 3.6+, поэтому я буду делать это в ближайшее время. В настоящее время мы используем XHTML 1.1, и, перейдя на HTML5, у меня возникают проблемы с именами имен символов... У кого-нибудь есть документ?
Я вижу, что есть список в WHATWG, но я не уверен, влияет ли это на файлы, которые были application/xhtml+xml
. Какими-либо средствами две упомянутые триггерные ошибки как в Chromium nightly, так и в FF 3.6.
Ответы
Ответ 1
Правильный ответ (современный способ)
Я задал этот вопрос пять лет назад. Теперь каждый браузер поддерживает 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.
Это вернет символ в ваш документ.
Ответ 2
Нет DTD для XHTML5, поэтому синтаксический анализатор XML не видит определений сущностей (кроме предопределенных). Если вы хотите использовать сущность, вы должны определить ее для себя во внутреннем подмножестве.
<!DOCTYPE html [
<!ENTITY mdash "—">
]>
<html xmlns="http://www.w3.org/1999/xhtml">
... — ...
</html>
(Конечно, использование внутреннего подмножества, вероятно, приведет к отключению браузеров, если вы подадите его им как text/html
. Отправка внутреннего подмножества в документе HTML5, отличном от XHTML, не разрешена.)
В HTML5 wiki в настоящее время рекомендуется:
Не используйте ссылки на сущности в XHTML (за исключением 5 предопределенных объектов: &
, <
, >
, "
и '
)
И я согласен с этим советом не только для XHTML5, но и для XML и HTML в целом. Там мало оснований для использования HTML-объектов для чего-либо сегодня. Юникод-символы, введенные непосредственно, гораздо читабельны для всех, и &#...;
ссылки на символы доступны для тех печальных случаев, когда вы не можете гарантировать транспортировку с 8-битным/кодированием-чистым. (Поскольку HTML-объекты не определены для большинства символов Юникода, вам все равно нужны они.)
Ответ 3
Мне нужна была проверка XML потенциально HTML 5. HTML 4 и XHTML имели только посредственные 250 или около того сущностей, а текущий проект (январь 2012) - более 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 разрешать эти символьные сущности.
Update October 2012: Поскольку рабочий проект теперь имеет 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 был бы намного более надежным, но не у всех был установлен node. У всех есть sed, не так ли? Вывод произвольной выборки:
<!ENTITY subsetneqq "⫋">
<!ENTITY subsim "⫇">
<!ENTITY subsub "⫕">
<!ENTITY subsup "⫓">
<!ENTITY succapprox "⪸">
<!ENTITY succ "≻">
Ответ 4
Мой лучший совет - не обновлять HTML5 или XHTML5 до тех пор, пока не будет предоставлена поддержка имен сущностей символов.
Любой, кто считает, что 〹
имеет больше смысла, чем —
, нуждается в обновлении мозга. Большинство людей не могут вспомнить огромные таблицы чисел.
Те из нас, кто должен оставаться со старыми операционными системами, чтобы быть совместимыми с существующим оборудованием для научного, реального времени или точки продажи (или правительственными сетями), не могут просто набирать персонажа или выбирать его из списка, Это не будет корректно сохранено в файле.
Причина, по которой нам навязывается, заключается в том, что w3c больше не хочет расходов на обслуживание файлов DTD, поэтому мы должны вернуться к каменному возрасту.
Ничего подобного, которое было предоставлено, никогда не должно быть устаревшим.
Ответ 5
Используя следующий ответ: fooobar.com/info/514143/..., я создал файл и разместил его как Gist на GitHub: https://gist.github.com/cerkit/c2814d677854308cef57 для тех из вас, кому нужны объекты в файле.
Я успешно использовал его с ASP.NET MVC, загрузив текстовый файл в объект Application и используя это значение с моим (правильно сформированным) HTML для анализа файла System.Xml.XmlDocument.
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.