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-1 | Latin-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 сделает это за вас — нет.