XHTML5 и HTML4 символьные объекты - PullRequest
10 голосов
/ 09 июля 2010

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

Ответы [ 5 ]

12 голосов
/ 09 июля 2010

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

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

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

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

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

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

6 голосов
/ 25 января 2012

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

<!ENTITY subsetneqq "&#10955;">
<!ENTITY subsim "&#10951;">
<!ENTITY subsub "&#10965;">
<!ENTITY subsup "&#10963;">
<!ENTITY succapprox "&#10936;">
<!ENTITY succ "&#8827;">
2 голосов
/ 03 декабря 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 .

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

1 голос
/ 03 декабря 2015

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

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

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

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

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

0 голосов
/ 20 мая 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 - это статическое свойство, которое загружает объекты из текстового файла и сохраняет их в объекте приложения, или использует значения, если они уже загружены в объект приложения.

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.

...