Когда следует использовать объекты HTML?

115

Это меня какое-то время сбивает с толку. С появлением UTF-8 в качестве стандарта де-факто в веб-разработке я не уверен, в каких ситуациях я должен использовать объекты HTML, а для каких - просто использовать символ UTF-8. Например,

  • длинное тире (-, &emdash;)
  • амперсанд (&, &)
  • 3/4 дроби (¾, ¾)

Пожалуйста, пролейте свет на эту проблему. Это будет оценено.

allesklar
источник
Кстати, что будет делать htmlentities () в PHP?
Джо Филлипс,
Читая ответы и комментарии, мне кажется, что еще не существует универсального правила в пользу того или другого, и ответ все равно зависит от того, от чего зависит .
Маджид Фуладпур,

Ответы:

76

Обычно вам не нужно использовать сущности символов HTML, если ваш редактор поддерживает Unicode. Сущности могут быть полезны, когда:

  • Ваша клавиатура не поддерживает вводимый вами символ. Например, на многих клавиатурах нет длинного тире или символа авторского права.
  • Ваш редактор не поддерживает Unicode (очень распространенный несколько лет назад, но, вероятно, не сегодня).
  • Вы хотите, чтобы в источнике было ясно, что происходит. Например,  код более четкий, чем соответствующий символ пробела.
  • Вам нужно бежать HTML специальные символы , такие как <, &или ".
JacquesB
источник
1
Очень полезно. Спасибо. Я использую полезную программу для получения необычных персонажей. Он называется popchar и создан Ergonis, но предназначен только для OS X.
allesklar
3
Боковое примечание: Википедия по-прежнему требует &nbsp;вместо фактического символа пробела, отчасти потому, что Firefox конвертирует U + 00A0 в U + 0020 в формах. Таким образом, использование объекта в этом случае - единственный способ гарантировать, что источник не будет испорчен каждый раз, когда пользователь Firefox редактирует его.
Joey
2
Прекрасное резюме, но что касается последнего пункта, его <часто нужно экранировать, никогда >"нужно экранировать лишь изредка внутри значений атрибутов).
Юкка К. Корпела
Еще одна причина сохранить & nbsp; так что вы можете отображать несколько пробелов на HTML-странице.
zylstra
Так &amp;что всегда следует использовать вместо &? Для этого есть причина?
Прометей
116

Основываясь на полученных мной комментариях, я рассмотрел это немного дальше. Кажется, что в настоящее время лучше всего отказаться от использования сущностей HTML и вместо этого использовать фактический символ UTF-8 . Перечислены следующие причины:

  1. Кодировки UTF-8 легче читать и редактировать тем, кто понимает, что означает символ, и знает, как его набирать.
  2. Кодировки UTF-8 так же непонятны, как кодировки сущностей HTML для тех, кто их не понимает, но они имеют преимущество отрисовки в виде специальных символов, а не трудных для понимания десятичных или шестнадцатеричных кодировок.

Если кодировка вашей страницы правильно настроена на UTF-8, вы должны использовать фактический символ вместо объекта HTML. Я прочитал несколько документов по этой теме, но наиболее полезными были:

Из статьи UTF-8: The Secret of Character Encoding :

Википедия - отличный пример приложения, которое изначально использовало ISO-8859-1, но перешло на UTF-8, когда оно стало слишком громоздким для поддержки иностранных языков. Теперь боты будут фактически просматривать статьи и преобразовывать сущности персонажей в соответствующие им реальные персонажи для удобства пользователя и возможности поиска .

В этой статье также приводится хороший пример китайской кодировки. Вот сокращенный пример ради лени:

UTF-8:

這兩個字是甚麼意思

HTML-объекты :

&#36889;&#20841;&#20491;&#23383;&#26159;&#29978;&#40636;&#24847;&#24605;

Кодировки объектов UTF-8 и HTML для меня бессмысленны, но, по крайней мере, кодировка UTF-8 распознается как иностранный язык , и она будет правильно отображаться в поле редактирования. В статье говорится следующее о версии с кодировкой объектов HTML:

Крайне неудобно для тех из нас, кто действительно знает, что такое сущности персонажей, совершенно непонятно для бедных пользователей, которые не знают! Даже несколько более удобные, «понятные» символьные сущности, такие как & theta; оставит пользователей, которые не заинтересованы в изучении HTML, ломать голову. С другой стороны, если они увидят θ в поле редактирования, они будут знать, что это специальный символ, и будут относиться к нему соответственно, даже если они не знают, как написать этот символ сами.

Как отмечали другие, вам все равно придется использовать объекты HTML для зарезервированных символов XML (амперсанд, меньше, больше).

Уильям Брендель
источник
Этот ответ очень помогает. Но чтобы уточнить, для моего собственного понимания: нет ничего опасного или недопустимого в использовании &entity;синтаксиса в документе HTML с объявленной кодировкой UTF-8, правильно? Хотя простые символы UTF-8 лучше по причинам, которые вы указали, нет проблем с тем, чтобы рядом с ними в одном документе были некоторые объекты HTML?
Джейкоб Форд
@JacobFord Правильно, смешивание HTML-сущностей с символами UTF-8 не опасно или недействительно, просто потенциально сбивает с толку кого-то, кто читает исходный текст.
Уильям Брендель,
5

Я бы не стал использовать UTF-8 для символов, которые легко спутать визуально. Например, трудно отличить эмдаш от минуса или, особенно, неразрывный пробел от пробела. Для этих персонажей обязательно используйте сущности.

Для символов, которые легко понять визуально (например, китайские примеры выше), используйте UTF-8, если хотите.

Нед Батчелдер
источник
5

Лично я уже давно все делаю в utf-8, однако на html-странице вам всегда нужно преобразовывать амперсанды (&), символы больше (>) и меньше (<) в их эквивалентные сущности, & amp ;, & Gt; и & lt;

Кроме того, если вы собираетесь программировать с использованием текста UTF-8, есть несколько вещей, на которые следует обратить внимание.

  • XML требует дополнительных строк для проверки при использовании сущностей.
  • Некоторые библиотеки плохо ладят с utf-8. Например, PHP в некоторых дистрибутивах Linux отказался от полной поддержки utf-8 в своих библиотеках регулярных выражений.
  • Труднее ограничить количество символов в тексте, использующем html-сущности, потому что одна сущность использует много символов. Также всегда есть риск разрезать объект пополам.
Марко Луглио
источник
Это очень второстепенный момент, но нет необходимости кодировать больше (>), только меньше (<).
Codemonkey
4

Сущности могут купить вам некоторую совместимость с мертвыми клиентами, которые неправильно понимают кодировки. Я не верю, что это касается каких-либо текущих браузеров, но вы никогда не знаете, какие еще программы могут вас заинтересовать.

Однако более полезным является то, что объекты HTML защищают вас от ваших собственных ошибок: если вы неправильно сконфигурируете что-то на сервере и в конечном итоге обслуживаете страницу с HTTP-заголовком, который говорит это, ISO-8859-1и METAтегом, который говорит это UTF-8, по крайней мере, ваши & mdash; es всегда будет работать.

Джим Пульс
источник
5
Однако вы можете привести противоположный аргумент - то, что &mdashотображается правильно, даже если заголовки неправильно настроены, затрудняет обнаружение проблемы.
Пекка
4

Сущности HTML полезны, когда вы хотите сгенерировать контент, который будет включаться (динамически) в страницы с (несколькими) разными кодировками. Например, у нас есть контент с белой этикеткой, который включен как в веб-страницы в кодировке ISO-8859-1, так и в UTF-8 ...

Если преобразование набора символов из / в UTF-8 не было таким большим ненадежным беспорядком (вы всегда натыкаетесь на некоторые символы и некоторые инструменты, которые не конвертируются должным образом), стандартизация UTF-8 была бы правильным решением.

мЯн
источник
2

Если ваши страницы правильно закодированы в utf-8, вам не нужны объекты html, просто используйте нужные символы напрямую.

Отавио Десио
источник
3
Я думаю, они вам все равно понадобятся для кодирования зарезервированных символов.
rmeador
@rmeador - Я согласен с этим.
Otávio Décio,
2

Для меня все предыдущие ответы имеют смысл.

Вдобавок: это в основном зависит от редактора, который вы собираетесь использовать, и языка документа. Минимальное требование к редактору - поддержка языка документа. Это означает, что если ваш текст на японском языке, остерегайтесь использования редактора, который не отображает их (то есть никаких сущностей для самого документа). Если это английский, вы даже можете использовать старый vim-подобный редактор и использовать сущности только для относительной редкости & copy; и друзья. Конечно: & gt; for> и другим специальным HTML-элементам по-прежнему нужны escape-символы. Но даже с другими языками latin-1 (немецким, французским и т. Д.) Писать ä - это боль, вы знаете где ...

Кроме того, я лично пишу объекты для невидимых символов и тех, которые похожи на стандартные символы ascii и поэтому их легко спутать. Например, u1173 (в некоторых наборах символов выглядит как тире) или u1175, который выглядит как вертикальная черта. В любом случае я бы использовал сущности для них.

blabla999
источник
& Gt; НЕ требуется для>, вы можете просто использовать>. & лт; Однако требуется для <.
Codemonkey