Русский язык в html коде
Объявление языка в HTML
Целевая аудитория: HTML кодеры, веб-разработчики (PHP, JSP, и т. д.), менеджеры веб-проектов, а также все, кто хочет лучше понимать, как объявлять язык текста на веб-странице.
Вопрос
Как установить язык содержимого моей HTML страницы?
Краткий ответ
Всегда используйте языковой атрибут тэга html для объявления языка по умолчанию на странице. Если страница содержит контент на другом языке, добавляйте языковой атрибут к элементам, окружающим этот контент.
Используйте lang атрибут для HTML страниц и xml:lang атрибут для страниц XML. Для XHTML 1.x и документов HTML5 Polyglot используйте оба атрибута вместе.
Используйте вложенные элементы для того, чтобы позаботиться о контенте и значения атрибутов для одинаковых элементов на разных языках.
Детали
Основы
Выбор корректного атрибута
Если ваш документ HTML (то есть обрабатывается, как text/html ), используйте lang атрибут для установки языка документа или блока текста. Например, следующий код установит французский языком по умолчанию:
Атрибут xml:lang не особо полезен для обработки HTML файлов, но он будет перекрывать значение lang атрибута каждый раз, когда вы обрабатываете документ, как XML. Атрибут lang разрешен синтаксисом XHTML и может быть распознан браузерами. Однако, когда используются другие синтаксические анализаторы XML (например, функция lang() в XSLT), вы не можете полагаться на то, что атрибут lang будет распознан.
Что, если содержимое элемента и значения его атрибутов на разных языках?
Иногда язык текста в атрибутах и язык непосредственно контента элемента различаются. Например, в правом верхнем углу этой статьи расположен список ссылок на другие переводы данной страницы. Текст ссылки отображает язык целевой страницы, но связанный title атрибут содержит подсказку на языке текущей страницы:
Вместо этого, перенесите языковой атрибут в другой элемент, как показано в данном примере, в котором span элемент наследует en язык по умолчанию, установленный у html элемента.
Что если нет подходящего элемента для того, чтобы прицепить атрибут языка?
Выбор значений языка
Чтобы быть уверенными, что юзер агенты распознают указанный вами язык, вам следует придерживаться стандартизированному подходу при указании значений атрибутов языка. Вам также необходимо подумать о том, как стандартизированно ссылаться на различные диалекты одного языка, например, такие, как американский и британский английский, которые существенно отличаются своим написанием и произношением.
Правила создания языковых атрибутов описываются IETF спецификацией, которая называется BCP 47. Помимо описания использования простых тэгов языка таких, как en (английский) или fr (французский), BCP 47 описывает, как сочетать языковые тэги, что позволяет вам указывать региональные диалекты, скрипты и другие варианты, относящиеся к данному языку.
Неофициальная утилита Language Subtag Lookup предоставляет удобный фронтенд инструментарий для IANA registry.
Дополнительная информация
Указание метаданных о языке аудитории
Это пример HTTP заголовка, объявляющего ресурс смесью английского, хинди панджаби языков:
Content-Language: en, hi, pa
Обратите внимание, что этот подход не сработает, если страница загружается с жесткого диска, CD или другого источника, не являющегося сервером. В настоящее время нет широко распространенного способа использования таких метаданных внутри страницы.
Различные вещи, которые не относятся к делу
Вероятно, стоит упомянуть ещё несколько моментов, которые не имеют отношения к этой дискуссии.
Первое, невозможно объявить язык с помощью CSS.
Третье, иногда люди предполагают, что информация о естественном языке может быть получена из кодировки символов. Тем не менее, кодировка символов не позволяет однозначно идентифицировать естественный язык. Должно быть взаимно однозначное сопоставление между кодировкой и языком, чтобы это сработало, а его нет. Одна кодировка может быть использована многими языками, например Latin 1 (ISO-8859-1) используется и французским, и английским, а ещё многими другими языками. В дополнение, кодировка может отличаться в рамках одного языка, например арабский может использовать ‘Windows-1256’ или ‘ISO-8859-6’ или ‘UTF-8’.
Все эти примеры кодировок спорны, так как весь контент сегодня должен быть создан в UTF-8, который охватывает все, кроме самых редких, языки.
В некоторых текстах, таких, как арабский и иврит, отображаемый текст читается в основном справа налево, хотя числа и иностранные термины отображаются слева направо. Необходима разметка, такая, как dir атрибут, для объявления right-to-left содержания. И в некоторых случаях разметка необходима для правильного отображения двунаправленного текста, но это невозможно сделать с помощью разметки языка.
То же самое относится к направлению текста. Как и в случае с кодировками, не всегда существует соответствие между языком и текстом, в том числе его направлением. Например, азербайджанский может быть записан справа налево (арабская письменность) и слева направо (латиница и кириллица), соответственно код языка az может относится к обоим вариантам. Дополнительно, разметка направления текста применяет к тексту целый ряд различных значений, в то время, как язык является простым переключателем, который не соответствует поставленным задачам.
Русский язык в html коде
Поэтому наличие на Интернетовской странице русских и английских букв не означает, что там тексты 2-х разных кодировок.
Нет, это одна, кириллическая кодировка, просто в неё, кроме русских букв, входят и английские.
Такая страница не считается в терминах
Кстати, каждый шрифт тоже сделан под определённую кодировку, а т.к. любая кодировка содержит набор символов ASCII, то любой шрифт всегда содержит английские буквы в дополнение к национальным.
При создании HTML-текста кириллической кодировки (то есть, текст с русскими, и если надо, английскими буквами), разработчик использует кириллический шрифт и соответствующую раскладку клавиатуры.
Как писать по-русски, используя шрифты и клавиатурные средства Windows (даже если это нерусская версия Windows) описано в разделе моего сайта.
Примечание. Кириллица в заголовке страницы, т.е. HTML тэг TITLE
Если разработчик или будущие пользователи работают под не русской Windows, то не стоит использовать кириллицу в не видна она будет во многих случаях.
Например, Internet Explorer (а также и новее, и и новее)
сможет показать кириллицу в TITLE под нерусской но не под нерусской
а не сможет показать вообще ни под какой нерусской Windows.
У меня есть тестовая страница с русским в TITLE (делалась для моей инструкции по Netscape, чтобы показать, как русский в Bookmarks работает): «Кириллица в TITLE»
Давайте рассмотрим несколько способов создания русского HTML текста.
Если Вы работает с таким редактором (который сам генерирует HTML код/тэги), то тут надо быть очень осторожным, научиться настраивать редактор для корректной генерации текстов с кириллицей.
Часто бывает так, что разработчик не настроил редактор, и редактор, ‘думая’, что в кодировке «Western», генерирует страницу, где кириллица ‘испорчена’.
То есть, редактор по умолчанию генерировал страницу кодировки
charset=windows-1252 или charset=iso-8859-1 или charset=us-ascii
т.к. автор не указал, что создает страницу кодировки
Если на некоей русской странице в Интернете Вы смотрите на исходный HTML текст через и там нет нормальных русских букв, то это обычно из-за подобной ошибки автора не настроил программу на создание именно кириллической страницы.
Настройка WYSIWYG HTML-редактора на создание русской страницы обеспечит выполнение вышеизложенных требований. Ниже приведены методы настройки для нескольких редакторов.
Как настроить WYSIWYG HTML редактор для генерации корректного кириллического HTML
Каждый редактор требует своей особой настройки, и разработчик должен отыскать способ настройки как начнёт вводить текст, а иначе его текст может просто-напросто пропасть, одни ‘вопросики’ будут
Такая настройка обеспечит создание корректного русского HTML текста, в котором будут нормальные русские буквы, а не их представления в виде, скажем, цифровых кодов.
Кроме того, Front Page 2000 вставит в HTML текст строку с указанием кодировки:
windows-1251 «>
Там надо выбрать кириллической шрифт через меню
Сам я не работал с DW, но собрал информацию (ниже).
Итак, настройка на работу с русским HTML:
Файл заново загрузится, но теперь DW уже будет знать, что за кодировка у этого файла, и всё будет в порядке.
Созданный HTML файл будет содержать нормальные русские буквы.
Кроме того, Word вставит в файл строку с указанием кодировки (это можно увидеть, использую опцию
windows-1251 «>
2. Конвертация обычного документа (.doc) в HTML
Созданный HTML файл будет содержать нормальные русские буквы.
Кроме того, Word вставит в файл строку с указанием кодировки (это можно увидеть, использую опцию
windows-1251 «>
Созданный HTML файл будет содержать нормальные русские буквы.
Кроме того, Word вставит в файл строку с указанием кодировки (это можно увидеть, использую опцию
windows-1251 «>
Вышеизложенное позволит создать нормальный и беспроблемный кириллический HTML текст.
HTML кодировки
Чтобы правильно отобразить html-документ, браузер должен знать какая кодировка символов использовалась при создании документа.
ASCII — одна из самых старых компьютерных кодировок, в которой каждому символу соответствует строго определенное число. Например, символу «a» соответствует число 97, а символу «A» — число 65.
Эта аббревиатура расшифровывается как American Standard Code for Information Interchange (американская стандартная кодировочная таблица для печатных символов и некоторых специальных кодов).
ASCII — это однобайтовая кодировка, в которую изначально заложено всего 128 символов: буквы латинского алфавита, арабские цифры и т.д.
Вы можете посмотреть на полный комплект Печатаемых символов ASCII.
Позже ASCII была расширена (изначально она не использовала все 8 бит), поэтому появилась возможность использовать уже не 128, а 256 (2 в 8 степени) различных символов, которые можно закодировать в одном байте информации.
Такое усовершенствование позволило добавлять в кодировку ASCII символы национальных языков разных стран, помимо уже существующей латиницы.
Вариантов расширенной кодировки ASCII существует очень много по причине того, что языков в мире тоже немало. Думаю, что многие из вас слышали о такой кодировке, как KOI8 (Код Обмена Информацией, 8 бит) — это тоже расширенная кодировка ASCII. KOI8 включала в себя цифры, буквы латинского и русского алфавита, а также знаки пунктуации, спецсимволы и псевдографику.
Кодировка ISO
Организация Международных стандартов (International Standards Organization) создала диапазон кодировок для различных алфавитов/языков.
Кодировки серии ISO 8859
Для документов на английском и большинстве других западноевропейских языков, широко поддерживается кодирование ISO-8859-1.
Для HTML4:
Для HTML5:
Примером ANSI-кодировки является всем известная Windows-1251.
Windows-1251 выгодно отличается от других 8 битных кириллических кодировок (таких как CP866 и ISO 8859-5) наличием практически всех символов, использующихся в русской типографике для обычного текста (отсутствует только знак ударения). Она также содержит все символы для других славянских языков: украинского, белорусского, сербского, македонского и болгарского.
Ниже приведены десятичные значения символов кодировки Windows-1251.
Для отображения символов таблицы в HTML-документе воспользуйтесь следующим синтаксисом:
Кодировка Windows-1251 (CP1251)
402
403
201A
453
201E
2026
2020
2021
20AC
2030
409
2039
40A
40C
40B
40F
452
2018
2019
201C
201D
2022
2013
2014
2122
459
203A
45A
45C
45B
45F
40E
45E
408
A4
490
A6
A7
401
A9
404
AB
AC
AD
AE
407
B0
B1
406
456
491
B5
B6
B7
451
2116
454
BB
458
405
455
457
410
411
412
413
414
415
416
417
418
419
41A
41B
41C
41D
41E
41F
420
421
422
423
424
425
426
427
428
429
42A
42B
42C
42D
42E
42F
430
431
432
433
434
435
436
437
438
439
43A
43B
43C
43D
43E
43F
440
441
442
443
444
445
446
447
448
449
44A
44B
44C
44D
44E
44F
Кодировки стандарта UNICODE
Кодировка UTF-8 является универсальной и имеет внушительный резерв на будущее. Это делает ее наиболее удобной кодировкой для использования в интернете.
Здесь приведена пошаговая инструкция правильной подготовки ваших русских страничек для WWW применительно к кодировке KOI8-R, не при каких условиях не требующая от пользователя выбора кодировки вручную.
Примечание для специалистов: атрибут lang определён только начиная с HTML 4.0, так что упомянутые выше DTD обязательны.
Что надо сделать дополнительно в случае использования нескольких языков в одном HTML документе и прочие подробности см. в разделе «Language information and text direction» описания стандарта HTML.
Спросите вашего веб-мастера, что за штука стоит у вас в качестве веб-сервера, если он ответит:
что Apache или Apache/RUS ,
При таких настройках не обязательно (но можно) указывать язык тэгом как описано выше. Указание языка внутри HTML документа имеет приоритет над указанием для сервера. Прочие тонкости указания языка и переключения между несколькими языками внутри одного HTML документа можно посмотреть подробнее в разделе «Language information and text direction» описания стандарта HTML.
Так как для текстовых ( *.txt ) документов никак нельзя указать язык внутри документа, указание для сервера это единственная альтернатива.
что NCSA ,
что CERN ,
Если вы не знаете, как указать кодировку в вашем HTTP сервере, вам придётся редактировать сами ваши странички. Если ваши HTML странички обрабатываются PHP используйте:
в самом начале файла. Если нет, а также для остальных типов файлов см. метод без вмешательства в конфигурацию сервера ниже.
метод без вмешательства в конфигурацию сервера
В секцию каждого HTML документа вставьте самой первой директивой следующий тэг:
Для стандарта HTML5 можно использовать предыдущую строку или сокращённую форму:
Т.е каждый ваш документ должен будет выглядеть так (пример для стандарта HTML5):
В начало файлов стилей ( *.css ) вставьте директиву:
Указание кодировки для текстовых файлов ( *.txt ) и JavaScript ( *.js ) скриптов без вмешательства в конфигурацию сервера несколько затруднительно и возможно только для внутренних ссылок. При внешних ссылках не в указанном ниже формате они будут отдаваться в неверной кодировке (что может, в каких-то случаях, компенсироваться алгоритмами автоугадывания конкретного браузера, а может и нет).
В стандарте HTML 4.01 вы можете использовать следующее:
В стандарте HTML5 то же самое пишется несколько по-другому:
Для скриптов на JavaScript в HTML 4.01 и HTML5:
Как проверить, удалось ли проставить кодировку и язык в HTTP заголовке?
Допустим, ваша страничка называется http://www.yourserver.ru/yourpath/yourpage.html
Вопросы и ответы
Some HTTP/1.0 software has interpreted a Content-Type header without charset parameter incorrectly to mean «recipient should guess.» Senders wishing to defeat this behavior MAY include a charset parameter even when the charset is ISO-8859-1 and SHOULD do so when it is known that it will not confuse the recipient.
Unfortunately, some older HTTP/1.0 clients did not deal properly with an explicit charset parameter. HTTP/1.1 recipients MUST respect the charset label provided by the sender; and those user agents that have a provision to «guess» a charset MUST use the charset from the content-type field if they support that charset, rather than the recipient’s preference, when initially displaying a document. See section 3.7.1.
3.7.1 Canonicalization and Text Defaults
The «charset» parameter is used with some media types to define the character set (section 3.4) of the data. When no explicit charset parameter is provided by the sender, media subtypes of the «text» type are defined to have a default charset value of «ISO-8859-1» when received via HTTP. Data in character sets other than «ISO-8859-1» or its subsets MUST be labeled with an appropriate charset value. See section 3.4.1 for compatibility problems.
Подробности и обоснования смотрите в разделе по написанию русских HTML документов (англ.) и в принципах работы с кодировками. Также можете ознакомиться с нашими впечатлениями по поводу текущего положения вещей в русскоязычной паутине и предварительным исследованием.