Символьные сущности XHTML5 и HTML4

Поддерживает ли XHTML5 символы, такие как   и —. На работе нам может потребоваться специальное программное обеспечение для доступа к административной части сайта, и люди требуют загрузки нескольких файлов. Для меня это простое оправдание необходимости перехода на FF 3.6+, так что я сделаю это в ближайшее время. В настоящее время мы используем XHTML 1.1, и после перехода на HTML5 у меня только возникли проблемы с именами персонажей... У кого-нибудь есть документ по этому поводу?

Я вижу, что есть список в WHATWG, но я не уверен, влияет ли это на файлы, обслуживаемые как application/xhtml+xml. В любом случае две упомянутые ошибки запускают как Chromium nightly, так и FF 3.6.


person Evan Carroll    schedule 09.07.2010    source источник


Ответы (5)


Для XHTML5 нет DTD, поэтому синтаксический анализатор XML не увидит никаких определений сущностей (кроме предопределенных). Если вы хотите использовать сущность, вам придется определить ее для себя во внутреннем подмножестве.

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

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

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

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

И я согласен с этим советом не только для XHTML5, но и для XML и HTML в целом. Сегодня нет особых причин использовать сущности HTML для чего-либо. Символы Unicode, введенные напрямую, гораздо более удобочитаемы для всех, а ссылки на &#...; символов доступны для тех печальных случаев, когда вы не можете гарантировать 8-битный/чистый транспорт с кодировкой. (Поскольку объекты HTML не определены для большинства символов Unicode, они вам все равно понадобятся.)

person bobince    schedule 09.07.2010
comment
Если вам нужна удобочитаемость, просто введите символ «—». Нет смысла пытаться выучить все имена объектов HTML. Используйте настоящего персонажа; вставьте его из карты символов, если вам нужно, но есть более простые способы ввода этих символов, если вы делаете это много. (На моей клавиатуре это получается, например, при нажатии shift-alt-minus.) - person bobince; 09.07.2010
comment
Я проголосовал за этот комментарий, потому что это правда, но как насчет того, как это менее читабельно, чем &#xa0; - person Evan Carroll; 09.07.2010
comment
Было бы лучше, если бы они просто формализовали эти во внутренний HTML5 DTD, а не оставлять его пустым. - person Evan Carroll; 09.07.2010
comment
Нет HTML5 DTD, пустого или другого, основанного на XML или нет! WHATWG заняла позицию, согласно которой DTD является устаревшим и недостаточным языком схемы для описания HTML5. (И это действительно так, это чертовски ужасно. XML-версия немного более разумна, чем ужасный оригинал SGML, но все же достаточно противна.) Таким образом, HTML5 определяет новую сериализацию, отличную от SGML, для простого HTML, которая имеет множество предопределенных сущностей. Но для XML-сериализации XHTML5 такая стратегия невозможна, поскольку единственный способ иметь объект в XML — это DTD (внутренний или внешний). - person bobince; 09.07.2010
comment
Вот почему большинство пользователей XML сегодня никогда не используют ссылки на сущности. Вот вам более читаемый неразрывный пробел: ‘ ’. (Shift-пробел на моей клавиатуре, FWIW!) - person bobince; 09.07.2010
comment
Верно, к сожалению, для глаза, читающего источник, это не отличается. - person Evan Carroll; 09.07.2010
comment
@bobince: RE: Для XHTML5 нет DTD. Я полагаю, что ваш ответ может нуждаться в обновлении. В Рекомендации W3C HTML5, раздел 9.2 Разбор XHTML В документах говорится: Эта спецификация предоставляет следующую дополнительную информацию, которую пользовательские агенты должны использовать при извлечении внешнего объекта:…(Этот URL-адрес представляет собой DTD, содержащий объявления объекта для имен, перечисленных в разделе ссылки на именованные персонажи.) - person DavidRR; 05.05.2015

Мне нужна проверка 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 разрешать эти символьные сущности.

Обновление, октябрь 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 был бы намного надежнее, но не у всех установлен узел. У всех сед, верно? Случайный образец вывода:

<!ENTITY subsetneqq "&#10955;">
<!ENTITY subsim "&#10951;">
<!ENTITY subsub "&#10965;">
<!ENTITY subsup "&#10963;">
<!ENTITY succapprox "&#10936;">
<!ENTITY succ "&#8827;">
person mogsie    schedule 25.01.2012
comment
Любой, кто возьмет мою идею и перепишет ее в коде, получит от меня +1. Я просто ленивый. - person mogsie; 25.01.2012
comment
ты все равно мог бы сделать один sed, echo foobarbaz | sed -e's/foo/bar/' -e's/baz/quz/' - person Evan Carroll; 03.12.2015

Правильный ответ (современный способ)

Я задавал этот вопрос пять лет назад. Теперь каждый браузер поддерживает 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.

Это правильно поместит символ в ваш документ.

person Evan Carroll    schedule 03.12.2015

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

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

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

Причина, по которой это было навязано нам, заключается в том, что w3c больше не хочет расходов на обслуживание файлов DTD, поэтому мы должны вернуться в каменный век.

Ничего подобного, что было предоставлено, никогда не должно быть устаревшим.

person midimagic    schedule 03.12.2015

Используя следующий ответ: https://stackoverflow.com/a/9003931/689044, я создал файл и разместил его. как 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, поэтому я решил, что лучшим путем будет загрузка текстового файла во время выполнения и сохранение его в объекте приложения.

person Michael Earls    schedule 19.05.2015