<meta charset = «utf-8»> против <meta http-эквивалента = «Тип контента»>


1535

Какие обозначения мне следует использовать для определения кодировки для HTML5 Doctype ?

  1. Короткий:

    <meta charset="utf-8" /> 
  2. Длинный:

    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

94
Использование тега <meta> для чего-то вроде типа контента и кодирования крайне иронично, поскольку, не зная этих вещей, вы не сможете проанализировать файл, чтобы получить значение метатега.
Марк

321
Вы можете анализировать его как ASCII, пока не дойдете до него. Алгоритм разбора HTML5 учитывает это.
Квентин

41
Следует отметить, что ни один из них не используется для анализа, когда страница обслуживается через Интернет. Вместо этого Content-Typeбудет использоваться заголовок HTTP- ответа. Метатег используется только тогда, когда страница загружается из локальной файловой системы диска.
BalusC

38
При определенных условиях метаэлемент используется через HTTP (включая отсутствие данных в заголовке HTTP)
Квентин,

78
Также забавно, что он называется charset, когда он действительно используется для указания кодировки. (кодировка Unicode, кодировка UTF-8)
Райан,

Ответы:


1084

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


23
Как насчет поддержки браузера? Работает ли <meta charset='utf-8'>в IE6?
Шиме Видас

11
Насколько я знаю, да.
Квентин

4
Вот обновленная ссылка на кодовую страницу Google , упомянутую @ Šime Vidas. В IE 6, 7 и 8 говорится: «В браузерах, отличных от IE, вы можете использовать document.characterSet. В IE вы можете подумать, что можете использовать document.getElementsByTagName ('meta') [0] .charset, но это возвращает только указанную вами кодировку символов, а не кодировку, которую фактически использует IE. "
hotshot309

7
Я знаю, что эта ветка старая, но gtmetrix.com/specify-a-character-set-early.html указывает, что использование <meta>для установки кодировки символов отключает загрузчик в IE8, который может повлиять на время загрузки страницы. Да, да, я знаю ... брось IE8. @ MészárosLajos может вернуться сюда через пару лет и сломать наши шары для поддержки IE8. ;-)
erturne

3
Сегодня у меня была проблема, когда корейские символы не появлялись в IE11. Отказ от короткого синтаксиса в пользу более длинного синтаксиса устранил проблему. Я не знаю, связано ли это с какой-то конфигурацией сервера, или это проблема с IE11 и кодировкой. Точная комбинация символов, на которой она не работала, была 베라.
Джеймс Доннелли

250

Обе формы объявления мета-кодировки эквивалентны и должны работать одинаково во всех браузерах. Но есть несколько вещей, которые вы должны помнить при объявлении набора символов веб-файлов как UTF-8:

  1. Сохранить файл (ы) в UTF-8 кодировке без с отметки порядка байтов (BOM).
  2. Объявите кодировку в ваших HTML-файлах, используя meta charset (как выше).
  3. Ваш веб-сервер должен обслуживать ваши файлы, объявив кодировку UTF-8 в заголовке HTTP Content-Type.

Серверы Apache по умолчанию настроены на обслуживание файлов в ISO-8859-1, поэтому вам нужно добавить следующую строку в ваш .htaccessфайл:

AddDefaultCharset UTF-8

Это настроит Apache для обслуживания ваших файлов, объявляющих кодировку UTF-8 в заголовке ответа Content-Type, но ваши файлы должны быть сохранены в UTF-8 (без спецификации) для начала.

Блокнот не может сохранить ваши файлы в UTF-8 без спецификации. Бесплатный редактор, который может это Notepad ++ . В строке меню программы выберите «Кодирование> Кодировать в UTF-8 без спецификации». Вы также можете открывать файлы и повторно сохранять их в UTF-8, используя «Кодировка> Преобразовать в UTF-8 без спецификации».

Подробнее о метке порядка байтов (BOM) в Википедии .


20
@CodeBoy Я бы изменил ваш ответ, сказав: «Вы должны сохранить ... без спецификации». На следующей странице написано «... для обеспечения совместимости обычно лучше не указывать спецификацию ...», что указывает на лучшую практику, но не является обязательным: w3.org/International/questions/qa-byte-order-mark
Johann

3
В IIS вы можете установить кодировку в заголовках HTTP с помощью <globalization fileEncoding = "utf-8" responseEncoding = "utf-8" /> в Web.Config - добавьте его в <system.web>
Крис Москини,

3
как я понимаю, это не имеет значения, если вы экономите с нашей без спецификации.
Дэвид 天宇 Вонг

3
Почему вы говорите, что UTF-8 HTML должен быть без спецификации? Наличие спецификации должно работать нормально. Также вам не нужен metaи HTTP-заголовок. Вам просто нужен один из metaзаголовка спецификации или HTTP.
hsivonen

5
Summing up: don't use BOM for UTF-8Я не могу согласиться с этим. Спецификация в UTF-8 очень полезна для сигнализации типа кодирования. В противном случае мы должны угадать или использовать такие вещи, как метатеги, к которым относится этот вопрос. Крутая вещь в спецификации состоит в том, что она является частью спецификации Unicode и, следовательно, может использоваться для всех данных, закодированных в Unicode, а не только для HTML. Что мы должны сделать, так это использовать спецификации повсюду, позволить старому программному обеспечению взорваться, сообщить об этих ошибках и исправить их.
Стейн де Витт

82

Еще одна причина, по которой стоит использовать короткую, заключается в том, что она соответствует другим случаям, когда вы можете указать набор символов в разметке. Например:

<script type="javascript" charset="UTF-8" src="/script.js"></script>

<p><a charset="UTF-8" href="http://example.com/">Example Site</a></p>

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

Обратите внимание, что атрибут charset нечувствителен к регистру. Вы можете использовать UTF-8 или UTF-8, однако UTF-8 более четкий, более читаемый, более точный.

Кроме того, нет абсолютно никакой причины использовать любое значение, кроме UTF-8, в атрибуте meta charset или заголовке страницы. UTF-8 является кодировкой по умолчанию для веб-документов начиная с HTML4 в 1999 году и единственным практичным способом создания современных веб-страниц.

Также вы не должны использовать HTML-объекты в UTF-8. Символы, такие как символ авторского права, должны быть напечатаны напрямую. Единственные объекты, которые вы должны использовать, - это 5 зарезервированных символов разметки: меньше, больше, амперсанд, простое, двойное простое. Для сущностей необходим анализатор HTML, который вы не всегда хотите использовать в будущем, они вносят ошибки, делают ваш код менее читаемым, увеличивают размеры файлов и иногда неправильно декодируют в различных браузерах в зависимости от того, какие сущности вы использовали. Узнайте, как ввести / вставить авторское право, торговую марку, открытую цитату, закрытую цитату, апостроф, тире, тире, маркер, евро и любые другие символы, которые встречаются в вашем контенте, и использовать эти фактические символы в коде. Mac имеет Просмотрщик символов, который вы можете включить в Системных настройках клавиатуры, и вы можете найти, а затем перетащить нужные символы или использовать соответствующее средство просмотра клавиатуры, чтобы увидеть, какие клавиши вводить. Например, товарным знаком является Option + 2. UTF-8 содержит все символы и символы из каждого письменного человеческого языка. Таким образом, нет оправдания для использования - вместо тире. Неплохая идея также изучить правила пунктуации и типографики ... например, зная, что точка идет внутри закрытой цитаты, а не снаружи.

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

Нет, это не правда. Браузер начинает синтаксический анализ файла как кодировки браузера по умолчанию, либо UTF-8, либо ISO-8859-1. Поскольку US-ASCII является подмножеством как ISO-8859-1, так и UTF-8, браузер может читать просто так или иначе ... это то же самое. Когда браузер обнаруживает метатегарсетный тег, если кодировка отличается от той, которую браузер уже использует, браузер перезагружает страницу в указанной кодировке. Вот почему мы помещаем мета-тег charset сверху, сразу после тега head, перед чем-либо еще, даже заголовком. Таким образом, вы можете использовать символы UTF-8 в заголовке.

Вы должны сохранить свои файлы в кодировке UTF-8 без спецификации

Это не совсем верно. Если в вашем документе только символы US-ASCII, вы можете сохранить его как US-ASCII и использовать его как UTF-8, потому что это подмножество. Но если есть символы Unicode, вы правы, вы должны сохранить как UTF-8 без спецификации.

Если вам нужен хороший текстовый редактор, который сохранит ваши файлы в UTF-8, я рекомендую Notepad ++.

На Mac используйте Bare Bones TextWrangler (бесплатно) из Mac App Store или Bare Bones BBEdit, который находится в Mac App Store за 39,99 $ ... очень дешево для такого замечательного инструмента. В любом приложении в нижней части окна документа есть меню, в котором вы указываете кодировку документа, и вы можете легко выбрать «UTF-8 без спецификации». И, конечно, вы можете установить это в качестве настроек по умолчанию для новых документов в настройках.

Но если ваш веб-сервер обслуживает кодировку в заголовке HTTP, что рекомендуется, оба [мета-тега] не нужны.

Это неверно. Конечно, вы должны установить кодировку в заголовке HTTP, но вы также должны установить ее в атрибуте meta charset, чтобы страница могла быть сохранена пользователем из браузера в локальное хранилище, а затем открыта снова позже, в этом случае единственным указанием на кодировку, которая будет присутствовать, является атрибут meta charset. Вы также должны установить базовый тег по той же причине ... на сервере базовый тег не нужен, но при открытии из локального хранилища базовый тег позволяет странице работать так, как если бы она находилась на сервере, со всеми активы на месте и тд, нет битых ссылок.

AddDefaultCharset UTF-8

Или вы можете просто изменить кодировку определенных типов файлов следующим образом:

AddType text/html;charset=utf-8 html

Совет по обслуживанию файлов UTF-8 и Latin-1 (ISO-8859-1) - дать файлам UTF-8 «текстовое» расширение, а файлам Latin-1 «txt».

AddType text/plain;charset=iso-8859-1 txt
AddType text/plain;charset=utf-8 text

Наконец, подумайте о сохранении ваших документов с окончаниями строк Unix, а не с устаревшими окончаниями строк DOS или (классических) строк Mac, которые не помогают и могут причинить вред, особенно в дальнейшем, когда мы все дальше и дальше удаляемся от этих устаревших систем. Документ HTML с правильной HTML5, кодировкой UTF-8 и окончаниями строк Unix - это хорошо выполненная работа. Вы можете обмениваться, редактировать, хранить, читать, восстанавливать и полагаться на этот документ во многих контекстах. Это лингва франка. Это цифровая бумага.


20
«Если в вашем документе только символы ISO-8859-1, вы можете сохранить его как ISO-8859-1 и использовать его как UTF-8, потому что это подмножество» - неверно. Было бы правильно, если вы измените «ISO-8859-1» на «US-ASCII». US-ASCII совместим с UTF-8, поскольку является подмножеством, а ISO-8859-1 - нет. Чтобы преобразовать ISO-8859-1 (содержащий не-ASCII-символы) в UTF-8, вам необходимо кодировать не-ASCII-символы. Кодовые точки для ISO-8859-1 существуют в Unicode, но UTF-8 кодирует те, которые находятся вне US-ASCII, в отличие от ISO-8859-1.
Томасруттер

2
Ваша точка зрения о сущностях HTML хорошая. В прошлом я использовал сущности только для того, чтобы обнаружить, что они были преобразованы в символы UTF-8 после сохранения в разных системах и / или открытия в разных редакторах. Тем не менее, стоит отметить, что неразрывные пробелы (& nbsp;) могут привести к сбивающим с толку результатам, поскольку вы, как правило, не будете видеть их в своем редакторе, поэтому для ясности обычно лучше сохранять их как сущности (по моему опыту).
Squidbe

"You should also set a base tag..."должны прийти с оговорками, описанными здесь .
Мафуба

Еще одна причина, по которой вы можете предпочесть сущности HTML, это то, что вы используете что-то вроде ионов . Я предпочел бы увидеть &#xf101;глиф по умолчанию или какой-то странный символ, который я не узнаю.
Даниэль Любаров

30

<meta charset="utf-8"> был введен с / для HTML5.

Как указано в документации, оба действительны. Тем не менее, <meta charset="utf-8">это только для HTML5 (и легче набрать / запомнить).

В свое время старый стиль обязательно станет устаревшим в ближайшем будущем. Я бы придерживался нового <meta charset="utf-8">.

Там только один путь, но вверх. В случае с технологией, это сворачивает старое (действительно, ДЕЙСТВИТЕЛЬНО быстро)

Документация: Атрибут HTML meta charset - W3Schools


2
Что касается ссылки, см. Meta.stackoverflow.com/questions/280478/why-not-w3schools-com
tripleee

18

Не оспаривая другие ответы, я думаю, что стоит упомянуть следующее.

  1. Долго" (http-equivОбозначения ) и «short» равны, в зависимости от того, что произойдет первым;
  2. Заголовки веб-сервера будут переопределять все <meta> теги;
  3. BOM (метка порядка байтов) переопределит все , и во многих случаях это повлияет на html 4 (и, возможно, на другие вещи);
  4. Если вы не объявляете какую-либо кодировку, вы, вероятно, получите текст в «резервной кодировке текста», которая определяется вашим браузером. Ни в Firefox, ни в Chrome это utf-8;
  5. При отсутствии других подсказок браузер будет пытаться прочитать ваш документ, как если бы он был в ASCII, чтобы получить кодировку, поэтому вы не можете использовать какие-либо странные кодировки (однако, это должно делать utf-16 с BOM);
  6. В то время как спецификации говорят, что объявление кодировки должно быть в пределах первых 512 байт документа, большинство браузеров будут пытаться читать больше, чем это.

Вы можете проверить, запустив echo 'HTTP/1.1 200 OK\r\nContent-type: text/html; charset=windows-1251\r\n\r\n\xef\xbb\xbf<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta charset="windows-1251"><title>привет</title></head><body>привет</body></html>' | nc -lp 4500и указав ваш браузер на localhost:4500. (Конечно, вы захотите изменить или удалить детали. Часть спецификации \xef\xbb\xbf. Будьте осторожны с кодировкой вашей оболочки.)

Обратите внимание, что очень важно, чтобы вы явно объявили кодировку. Разрешение браузерам угадывать может привести к проблемам с безопасностью.


1
Хорошие моменты, но не могли бы вы рассказать, какие проблемы безопасности вы имеете в виду?
Армфут

1
Длинная нотация не должна перекрывать короткую - просто первая в документе должна победить.
gsnedders

1
@Armfoot В прошлом были проблемы с UTF-7тем, что я помню. Кроме того, прослушивание в Интернете, как правило, плохо, например, когда вы загружаете изображение, которое воспринимается как содержимое сценария.
23.09.16

@gsnedders протестирован в Chrome и Firefox, вы правы. отредактировал ответ соответственно. Armfoot: это было что-то вроде 7-битной кодировки, не помню что именно.
белка

1
@CraigMcQueen почти уверен, что резервный браузер по-прежнему (в 2018 г.) по умолчанию использует западноевропейский в Западной Европе, поэтому я полагаю, что по умолчанию используется кодировка до Юникода, преобладающая в каждом регионе. Пользователи могут установить запасной вариант для utf-8, но это просто разоблачает все дерьмовые кодировки, которые тысячи сайтов по-прежнему используют в качестве блестящих высокобайтовых символов ascii во всем, так что это все еще не распространено. Больше жалости. Не могу понять, как это изменится без небольшого принуждения со стороны производителей браузеров, и они не заинтересованы в том, чтобы ломать устаревшие вещи.
brennanyoung

13

использование <meta charset="utf-8" /> для веб-браузеров при использовании HTML5.

Используйте <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />при использовании HTML4 или XHTML, или для устаревших парсеров dom, как DOMDocumentв php 5.3


2

Есть некоторые новости, основанные на Mozilla Foundation , и sitepoint

Не используйте это значение ( http-equiv=content-type), поскольку оно устарело. Предпочитайте charsetатрибут в metaэлементе < >. введите описание изображения здесь


о, наконец, что-то более свежее
Айяш

1

Чтобы вставить подпись в электронное письмо, я бы использовал длинную версию:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Причина в том, что не многие читатели электронной почты используют html5, поэтому всегда лучше использовать старые стили html. На самом деле, лучше использовать таблицы, чем divs + css.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.