Объекты символов 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">
    ... &mdash; ...
</html>

(Конечно, использование внутреннего подмножества, вероятно, приведет к отключению браузеров, если вы подадите его им как text/html. Отправка внутреннего подмножества в документе HTML5, отличном от XHTML, не разрешена.)

В HTML5 wiki в настоящее время рекомендуется:

Не используйте ссылки на сущности в XHTML (за исключением 5 предопределенных объектов: &amp;, &lt;, &gt;, &quot; и &apos;)

И я согласен с этим советом не только для 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/"/\&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 разрешать эти символьные сущности.

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 "&#10955;">
<!ENTITY subsim "&#10951;">
<!ENTITY subsub "&#10965;">
<!ENTITY subsup "&#10963;">
<!ENTITY succapprox "&#10936;">
<!ENTITY succ "&#8827;">

Ответ 4

Мой лучший совет - не обновлять HTML5 или XHTML5 до тех пор, пока не будет предоставлена ​​поддержка имен сущностей символов.

Любой, кто считает, что &#12345; имеет больше смысла, чем &mdash;, нуждается в обновлении мозга. Большинство людей не могут вспомнить огромные таблицы чисел.

Те из нас, кто должен оставаться со старыми операционными системами, чтобы быть совместимыми с существующим оборудованием для научного, реального времени или точки продажи (или правительственными сетями), не могут просто набирать персонажа или выбирать его из списка, Это не будет корректно сохранено в файле.

Причина, по которой нам навязывается, заключается в том, что 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: &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.