W3docs

HTML-атрибут accept-charset

Атрибут HTML accept-charset задаёт кодировку символов для отправки формы. Узнайте, как использовать его на элементе <form>.

HTML-атрибут accept-charset задаёт кодировку символов (charset), которую браузер должен использовать при отправке формы на сервер.

Этот атрибут можно применять только к элементу <form> — он не имеет смысла для полей ввода, кнопок и любых других тегов. Его значение — разделённый пробелами или запятыми список одной или нескольких кодировок. Значение по умолчанию — UNKNOWN, которое указывает браузеру использовать ту же кодировку, что и документ, содержащий форму. Писать accept-charset="UNKNOWN" явно никогда не нужно: именно это значение вы получаете, полностью опустив атрибут.

Зачем нужен этот атрибут

Чтобы понять accept-charset, нужно вспомнить веб до повсеместного распространения UTF-8. В конце 1990-х и 2000-х годах документы нередко передавались в однобайтовых кодировках, таких как ISO-8859-1 (западноевропейская), Shift_JIS (японская) или windows-1251 (кириллическая). Страница в одной кодировке могла отправлять данные на сервер, ожидавший другой, и поле формы с символами, которые целевая кодировка не поддерживала, поступало на сервер в виде нечитаемых байт (мокибаке). Атрибут accept-charset служил выходом из ситуации: он позволял автору указать «кодировать данные этой формы в такой-то кодировке, независимо от кодировки самой страницы».

Именно такое несоответствие — единственная ситуация, в которой атрибут когда-либо имел значение: страница в одной устаревшей кодировке передаёт данные бэкенду, ожидающему другую. Когда весь стек перешёл на UTF-8, проблема исчезла.

Важно: сегодня этот атрибут фактически ничего не делает. На практике каждый современный браузер отправляет данные формы в кодировке самого документа — UTF-8 для любой современной страницы — независимо от значения accept-charset. (Алгоритм отправки форм в HTML определяет, как должна выбираться указанная кодировка, но поскольку сегодня страницы и браузеры используют UTF-8 на всех уровнях, атрибут ничего не меняет.) Для новых страниц надёжный способ управлять кодировкой — раздавать документ в UTF-8 (с помощью <meta charset="UTF-8">) и позволить браузеру отправлять UTF-8; атрибут accept-charset почти никогда не нужен.

Синтаксис

<form accept-charset="character_set"></form>

Распространённые значения кодировок

ЗначениеОписание
UTF-8Универсальная кодировка Unicode. Поведение по умолчанию в каждом современном браузере и рекомендуемое значение практически для всех форм.
ISO-8859-1Latin-1, устаревшая 8-битная кодировка для западноевропейских языков. Не поддерживает большинство нелатинских символов; актуальна только для старых систем.
UNKNOWNЗначение по умолчанию. Указывает браузеру использовать ту же кодировку, что и документ, содержащий форму.

Можно перечислить несколько кодировок (например accept-charset="UTF-8 ISO-8859-1"); предполагается, что браузер выберет первую из поддерживаемых. В современных браузерах этот список фактически игнорируется.

Современный, правильный подход

Для практически любой формы, которую вы пишете сегодня, правильный подход — ничего особенного не делать: раздавать страницу в UTF-8 и опустить accept-charset. Тогда форма автоматически отправит данные в UTF-8, что и должен ожидать ваш сервер.

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>Contact form</title>
  </head>
  <body>
    <!-- No accept-charset needed: UTF-8 page submits as UTF-8 -->
    <form action="/contact" method="post">
      <input type="text" name="name" placeholder="Your name" />
      <input type="email" name="email" placeholder="Your email" />
      <input type="submit" value="Send" />
    </form>
  </body>
</html>

Если хочется быть явным, написать accept-charset="UTF-8" не навредит и задокументирует намерение — но ничего не изменит, поскольку UTF-8 и так является поведением по умолчанию.

Пример использования HTML-атрибута accept-charset

В примере ниже задан accept-charset="ISO-8859-1" — устаревшая кодировка — для иллюстрации синтаксиса атрибута. Обратите внимание: современные браузеры всё равно отправят форму в UTF-8 — это демонстрация, а не рекомендация.

<!DOCTYPE html>
<html>
  <head>
    <title>Title of the document</title>
    <style>
      input {
        display: block;
        margin-bottom: 10px;
      }
    </style>
  </head>
  <body>
    <form action="/form/submit" accept-charset="ISO-8859-1" method="post">
      <input type="text" name="name" placeholder="Enter your Name" />
      <input type="text" name="surname" placeholder="Enter your Surname" />
      <input type="number" name="age" placeholder="Enter your Age" />
      <input type="submit" value="Send" />
    </form>
  </body>
</html>

Связанные атрибуты формы

Атрибут accept-charset работает совместно с другими атрибутами элемента <form>:

  • action — URL, на который отправляются данные формы.
  • method — HTTP-метод (GET или POST), используемый при отправке формы.
  • Тег <form> — контейнерный элемент, к которому относятся эти атрибуты.

Связанный атрибут enctype (задаётся на <form>) управляет тем, как кодируются данные формы (например multipart/form-data для загрузки файлов) — это отдельный вопрос, не связанный с кодировкой символов, которую описывает accept-charset. Полную картину, включая enctype, смотрите в главе HTML Forms.

Что делать, если нужно поддерживать устаревший сервер без UTF-8?

Поскольку браузеры игнорируют accept-charset, нельзя принудить страницу на UTF-8 к отправке данных в ISO-8859-1 (или любой другой кодировке) простой установкой этого атрибута — такой путь ведёт в тупик. Если вы вынуждены работать со старым бэкендом, понимающим только однобайтовую кодировку, правильное решение находится на стороне сервера, а не в HTML:

  • Конвертировать на сервере. Принять отправку в UTF-8 и перекодировать её в нужную устаревшую кодировку (например с помощью mb_convert_encoding в PHP, bytes.decode/encode в Python или аналогов для вашей платформы). Это современный, рекомендуемый подход.
  • Перевести бэкенд на UTF-8 там, где это возможно, — это навсегда устраняет целый класс проблем.

Принимать отправку в UTF-8 на уровне передачи и конвертировать на границе — надёжно; рассчитывать, что accept-charset сделает это за вас — нет.

Практика

Практика
What is the HTML 'accept-charset' attribute?
What is the HTML 'accept-charset' attribute?
Практика
On which element can you use the accept-charset attribute?
On which element can you use the accept-charset attribute?
Практика
What happens in a modern browser if you omit accept-charset on a UTF-8 page?
What happens in a modern browser if you omit accept-charset on a UTF-8 page?
Was this page helpful?