Отображение символов Юникода в HTML

89

Я хочу просто отобразить символы галочки (✔) и крестика (✘) на HTML-странице, но они отображаются либо как прямоугольник, либо как кружок ✠»- очевидно, что-то связано с кодировкой.

Я установил метатег для отображения utf-8, но, очевидно, что-то мне не хватает.

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

Изменить / Решение. Из комментариев, сделанных с помощью FireBug, я обнаружил, что заголовки, передаваемые моей страницей, на самом деле были «Content-Type: text / html», а не UTF-8. Просмотр формата файла с помощью Notepad ++ показал, что мой файл был отформатирован как «UTF-8 без спецификации». Изменив это значение только на UTF-8, символы теперь отображаются правильно ... но firebug по-прежнему указывает на тот же тип содержимого.

Питер Крейг
источник

Ответы:

56

Вы должны убедиться, что заголовки HTTP-сервера верны.

В частности, заголовок:

Content-Type: text/html; charset=utf-8

должен присутствовать.

Мета-тег игнорируется браузерами, если присутствует HTTP-заголовок.

Также убедитесь, что ваш файл действительно закодирован как UTF-8 перед его обслуживанием, проверьте / попробуйте следующее:

  • Убедитесь, что ваш редактор сохранил его как UTF-8.
  • Убедитесь, что ваш FTP или любая программа для передачи файлов не вмешивается в файл.
  • Попробуйте использовать объекты в кодировке HTML, например &#uuu;.
  • Чтобы быть действительно уверенным, создайте шестнадцатеричный дамп файла и посмотрите как символ, для ✔ это должен быть E2 9C 94.

Примечание. Если вы используете символ Юникода, для которого ваша система не может найти глиф (нет шрифта с этим символом), ваш браузер должен отобразить вопросительный знак или какой-либо символ, подобный блоку. Но если вы видите несколько латинских символов, как и вы, это означает проблему с кодировкой.


источник
Фактически, метатег не игнорируется, но заголовок HTTP имеет приоритет. Спасибо Конраду за точность.
8
Обратите внимание, что для использования символа Юникода в contentсвойстве ::beforeселектора CSS необходимо использовать нотацию обратной косой черты. например: '\ 2713' вместо '& # 2713'.
Fabien Snauwaert 01
18

Я знаю, что ответ уже принят, но хочу отметить несколько моментов.

Очевидно, что установка content-typeи charsetявляется хорошей практикой, гораздо лучше делать это на сервере, поскольку это обеспечивает согласованность во всем приложении.

Однако я бы использовал UTF-8только тогда, когда язык моего приложения использует много символов, которые доступны только в UTF-8кодировке. Если вы хотите отобразить символ или символ Unicode в одном из случаев, вы можете сделать это, не меняя charsetстраницы.

HTMLсредства визуализации всегда могли отображать символы, которые не являются частью набора символов кодировки страницы, если вы упоминаете символ в его numeric character reference (NCR). Звучит странно, но это правда.

Таким образом, даже если у вас htmlесть заголовок, в котором указано, что он имеет кодировку ansiили любую из кодировок iso, вы можете отобразить галочку, используя ссылку на символ html в десятичном формате - & # 10003; или в шестнадцатеричном формате - & # x2713;

Поэтому немного сложно понять, почему вы сталкиваетесь с этой проблемой на своих страницах. Можете ли вы проверить правильность значения NCR, это хорошая ссылка http://www.fileformat.info/info/unicode/char/2713/index.htm

Акшай
источник
6
«Однако я бы использовал UTF-8 только в том случае, если в языке моего приложения используется много символов, доступных только в кодировке UTF-8» Почему? В чем недостаток переключения?
dumbledad
3
@dumbledad: Очень хороший вопрос, думаю, я позволил своему предубеждению затуманивать мой ответ. Я хотел сказать, что если все ваше приложение уже не является UTF-8, изменение его приложения для одной страницы может оказаться слишком трудоемким. Кроме того, если вашему языку программирования и контенту не нужны символы utf-8, вы можете случайно скопировать и вставить ненужный символ, с которым ваш редактор будет в порядке (так как он находится в режиме utf-8), но код не будет выполнен во время выполнения. Сказав это, по возможности обновляйте кодировку и набор символов
Акшай,
6

Убедитесь, что вы действительно сохранили файл как UTF-8, или используйте объекты HTML ( &#nnn;) для специальных символов.

Гуффа
источник
Похоже, что для ✔ нет HTML-объекта, или я его пропустил? Как «на самом деле» сохранить файл как UTF-8 и как это проверить?
Питер Крейг
@Peter: используя приличный редактор. Большинство текстовых редакторов имеют параметр в диалоговом окне «Сохранить как», чтобы указать кодировку файла, или у них есть другой параметр, скрытый где-то в их меню. Vim использует эту fileencodingнастройку.
Конрад Рудольф
8
@Peter, вы можете ссылаться на любой символ по его коду. Попробуйте & # x2714; для галочки.
Дэн Дайер
сохранить как utf-8. интересная концепция. хорошо работает, если вы создаете статические HTML-страницы. но ... как насчет динамических веб-страниц? этот материал unicode / utf-8 / wide character действительно сбивает меня с толку. мой бэкэнд-код - Perl. заголовок http установлен правильно, как и заголовок html. W3C Internationalization Checker подтверждает, что у меня установлен документ utf-8. имеет ли КАЗИНГ значение? наконец, как насчет полей ввода текста? я все еще получаю goop! :(
Джаретт Ллойд
дополнение к предыдущему комментарию: моя база данных показывает, что данные были введены правильно, и символы отображаются правильно. Итак, не проблема с базой данных. мой сценарий perl (или, скорее, редактор) настроен на сохранение сценариев как utf-8. мой сервер, apache2, я совершенно уверен, что он не мешает или настроен правильно. все это сказал, все еще не уверен, почему символы goop. тьфу. должен быть лучший способ
Джаретт Ллойд
5

В отличие от предложенного Николасом, metaтег фактически не игнорируется браузерами. Однако Content-Typeзаголовок HTTP всегда имеет приоритет над наличием metaтега в документе.

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

Использование HTML-сущностей также следует рассматривать как обходной путь - обход реальной проблемы. Правильная настройка веб-сервера предотвращает множество неприятностей.

Конрад Рудольф
источник
0

Я думаю, что это проблема с файлом, вы просто сохранили свой файл в 1-байтовой кодировке, например, latin-1. Google ваш редактор и как установить файлы в utf-8.

Интересно, почему есть редакторы, которые по умолчанию не используют utf-8.

Кугель
источник