Статьи

HTML5 Мастерство: Кодирование

Мастерство HTML5

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

Тем не менее, нам повезло, и большинство вещей уже хорошо подготовлены. Нам нужно только убедиться, что наши документы сохранены (и переданы) в правильной кодировке. Правильная кодировка — это та, которую мы указываем. Это может быть что угодно, лишь бы оно содержало все нужные нам символы и пока мы оставались последовательными.

Существует три важных правила кодирования текста для HTML:

  1. Загрузите контент с правильной кодировкой.
  2. Передайте контент с той же кодировкой.
  3. Убедитесь, что клиент читает содержимое с указанной кодировкой.

В этой статье мы подробнее рассмотрим все три правила, особенно второе и третье. В конце мы также рассмотрим кодирование форм, которое не имеет прямого отношения к кодированию текста, но косвенно. Мы увидим, почему есть какая-то связь.

Либо мы знаем, что наш контент должен быть доставлен в какой-то экзотической кодировке, либо нам просто нужно выбрать UTF-8. Есть много причин, почему мы хотели бы использовать UTF-8. Это не лучший формат для хранения символов в памяти, но он просто замечательный как основа для обмена данными и передачи контента. Это в основном легкая задача. Тем не менее, одной из наиболее распространенных ошибок является сохранение файлов без надлежащего кодирования. Поскольку нет текста без кодировки, мы должны тщательно выбирать кодировку.

Пользователи Sublime Text и большинства других текстовых редакторов, вероятно, никогда не сталкивались с проблемой неправильной кодировки, поскольку эти редакторы сохраняются в UTF-8 по умолчанию. Существуют редакторы, в основном для платформы Windows, которые используют другой формат по умолчанию, например, Windows-1252.

Даже в Sublime Text это одна из самых стандартных операций для изменения кодировки файла. В меню File мы выбираем Save with Encoding и выбираем тот, который нам нужен. Это оно!

Сохранение текста Кодировка возвышенного текста

В принципе, каждый более продвинутый редактор должен иметь такие опции. Иногда они содержатся в расширенном меню сохранения. Например, редактор для Microsoft Visual Studio вызывает специальный диалог после нажатия Advanced Save Options … в меню File .

Visual Studio Advanced Save

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

Протокол HTTP передает данные в виде простого текста. Даже если мы решим закодировать передаваемый контент как GZip или если мы используем HTTPS, который шифрует контент, базовый контент по-прежнему остается простым текстом. Мы уже узнали, что не существует такого понятия, как простой текст. Нам всегда нужно ассоциировать контент с некоторой кодировкой, чтобы получить текстовое представление.

HTTP-сообщение разделено на две части. Верхняя часть называется заголовками. Пустой строкой отделена нижняя часть: корпус.

Всегда есть как минимум два HTTP-сообщения: запрос и связанный с ним ответ. Оба типа сообщений имеют эту структуру. Тело ответа — это контент, который мы хотим передать. Тело запроса представляет интерес только для отправки формы, о которой мы позаботимся позже. Если мы хотим предоставить некоторую информацию о кодировке контента, мы должны предоставить некоторую информацию в заголовке.

Следующий заголовок сообщает принимающей стороне, что тело содержит специальный текстовый формат, называемый HTML, с использованием набора символов UTF-8.

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

Существует также заголовок Content-Encoding . Мы можем легко спутать кодировку контента с фактической текстовой кодировкой контента. Первый используется для указания кодирования всего пакета, например GZip, в то время как последний используется в качестве начальной настройки, например, для анализа предоставленного контента.

Если мы заботимся о правильности этого шага, мы должны убедиться, что наш веб-сервер отправляет правильный заголовок. Большинство веб-фреймворков предлагают такую ​​возможность. В PHP мы могли бы написать:

php header('Content-Type:text/html; charset=utf-8');

В Node.js мы можем использовать следующее, где res — это переменная, представляющая запрос:

javascript res.setHeader('Content-Type', 'text/html; charset=utf-8');

Переданный заголовок установит для текстового сканера ввода HTML заданную настройку. В случае предыдущего примера мы используем UTF-8 . Но подождите: начальная настройка! Есть много способов переопределить это. Если фактическим содержимым является не UTF-8, сканер может распознать это и изменить настройку. Такое изменение может быть инициировано обнаружением Byte-Order-Mark (известным как BOM) или путем нахождения специфичных для кодирования шаблонов в контенте. Напротив, первый ищет искусственно сшитые узоры.

Наконец, кодировка может измениться из-за нашего HTML-кода. Это может быть изменено только один раз.

Как только конструктор DOM найдет meta , он будет искать объявление charset . Если он найден, набор символов будет извлечен. Если мы можем извлечь его успешно и если кодировка действительна, мы устанавливаем новую кодировку для сканирования дальнейших символов. В этот момент кодировка будет заморожена, и дальнейшие изменения невозможны.

Есть только одна оговорка. Чтобы проверить, было ли предыдущее сканирование в порядке, нам нужно сравнить уже отсканированные символы с символами, которые были бы отсканированы. Следовательно, нам нужно посмотреть, изменило бы ранее изменение кодировки. Если мы находим разницу, нам нужно перезапустить всю процедуру разбора. В противном случае вся структура DOM может быть неправильной до этого момента.

Как следствие, мы уже выучили два урока:

  1. Поместите <meta charset=utf-8> (или другую кодировку) как можно скорее.
  2. Используйте только символы ASCII перед указанием атрибута charset в HTML.

Наконец, хороший стартер для шаблона выглядит следующим образом. Как мы узнали из предыдущей статьи, мы можем опустить теги head и body . Фрагмент делает две вещи правильно: он использует правильный тип документа и выбирает набор символов как можно скорее.

« `html <! DOCTYPE html>

Название здесь « `Единственный оставшийся вопрос: что произойдет, если я забуду один из этих трех шагов? Ну, первый и третий шаги являются наиболее важными. Передача на самом деле не так уж и плоха. Если исходная кодировка не указана в заголовках HTTP, браузер выберет исходную кодировку в зависимости от локали пользователя. С немецкой локалью мы получаем Windows-1252. Это на самом деле по умолчанию для большинства стран. В некоторых странах, таких как Польша или Венгрия, выберите * Latin2 *, также известный как * iso-8859-2 *. В принципе, нам не нужно беспокоиться об этой исходной кодировке, если мы следовали рекомендациям, описанным ранее. ASCII является подмножеством Unicode, и большинство из перечисленных кодировок на самом деле являются просто расширениями ASCII для удовлетворения специфических потребностей одной или нескольких стран. Если мы будем использовать только базовые символы ASCII, пока не будет указан набор символов, у нас все будет хорошо. Гораздо более серьезным является конфликт между сохраненными / считанными или сгенерированными данными, которые доставляются клиенту, и оператором в теге `meta`. Если что-то пошло не так, мы можем увидеть следующие изображения. Это не приятный пользовательский опыт. ! [Проблема кодирования] (https://cms-assets.tutsplus.com/uploads%2Fusers%2F659%2Fposts%2F24841%2Fimage-1442219759748.png) Возвращаясь к определению правильной кодировки, существует множество причин, почему UTF-8 будет лучшим выбором. Любая другая кодировка должна быть по крайней мере достаточной для символов, которые мы хотим отобразить. Однако, если мы предоставим поля ввода формы, у нас могут возникнуть проблемы. На данный момент мы не контролируем символы, которые больше используются. Пользователи могут вводить что угодно здесь. Давайте посмотрим, как мы можем контролировать кодирование для ввода формы. ## Отправка форм Форма отправляется с определенным типом кодировки, который не совпадает с типом кодировки ответа сервера, например, GZip. Тип кодировки формы определяет способ сериализации формы перед отправкой на сервер. Это особенно полезно в сочетании с глаголом HTTP. Обычные представления формы используют `POST` в качестве HTTP-глагола, но` GET`, `PUT` и` DELETE` также распространены. Только `POST` и` PUT` должны использовать тело для передачи контента в запросе. Браузер создаст содержимое в соответствии с выбором атрибута `enctype` для`

`элемент, указывающий тип кодировки. Тип кодирования передается путем установки заголовка `Content-Type` в HTTP-запросе. Существует три хорошо известных типа кодирования: 1. URL-кодировка (значение по умолчанию, явно * application / x-www-form-urlencoded *) 2. Простой текст (* text / plain *) 3. Multipart (* multipart / form- данные *) Первое и второе довольно похожи, но имеют небольшие (и очень важные) различия. Третий вариант — самый мощный метод. Это даже позволяет транспортировать произвольные файлы как вложения. Ключевое различие между первыми двумя типами состоит в том, что передача закодированной формы URL в процентах кодирует все имена и значения, что не выполняется простым текстом. Кодирование процентов гарантирует, что принимающая сторона может различать имена и значения. Эта гарантия не существует с простой формой представления текста. Третий вариант использует граничную строку для разделения записей, которая является уникальной по конструкции. Давайте представим различия, отправив простую форму. Форма содержит следующий код: « `html « `При отправке формы без указания какого-либо типа кодировки передается следующее тело:` « plain first = С + пробелы% 2Bsigns & second = H% E4llo + D% FC% 3F & third = Multi% 0D% 0Alines% 0D% 0Arock « ` Кодировка URL преобразует символы пробела в знаки плюс. Существующие знаки плюс, как и все «специальные» символы, преобразуются по правилам кодирования процентов. Это особенно относится к новым строкам, изначально представленным как `\ r \ n`, которые теперь отображаются как`% 0D% 0A`. Давайте посмотрим, как выглядит результат для кодирования простого текста. « `просто первое = с пробелами + знаки второе = Hällo Dü? third = Multi line rock « `Пары разбиты новыми строками. Это особенно проблематично для многострочного контента и может привести к неправильным представлениям. Таким образом, многокомпонентное кодирование объединяет преимущества представления простого текста с определенной границей, что по существу решает проблемы кодирования простого текста. Единственный недостаток — увеличенная длина контента. « `plain —— WebKitFormBoundaryzQRASBvDO1bUB5Lp Content-Disposition: form-data; name = «first» С пробелами + знаками —— WebKitFormBoundaryzQRASBvDO1bUB5Lp Content-Disposition: form-data; name = «второй» Hällo Dü? —— WebKitFormBoundaryzQRASBvDO1bUB5Lp Content-Disposition: form-data; name = «third» Многострочный рок —— WebKitFormBoundaryzQRASBvDO1bUB5Lp— « `Последние два метода кодирования форм также отображали специальные символы в точности так, как мы их ввели. Передача формы в основном использует атрибут `accept-charset` соответствующего`
`элемент. Если такой атрибут не указан, используется кодировка страницы. Опять же, установка правильной кодировки важна. В будущем мы увидим четвертый тип кодирования, называемый `application / json`. Как следует из названия, он будет упаковывать содержимое формы в строку JSON. ## Заключение Выбор правильной кодировки может быть так же просто, как выбор UTF-8. Типичных проблем можно избежать, если последовательно использовать одну и ту же кодировку. Объявление кодировки во время транспортировки, безусловно, полезно, хотя и не обязательно, особенно если мы следуем передовым методам размещения Элемент `с атрибутом` charset`. Отправка формы — это процесс, который зависит от правильного выбора кодировки — не только для текста, но и для самой отправки. В общем, мы всегда можем выбрать «multipart / form-data» в качестве «enctype», хотя тип кодировки по умолчанию может быть лучше (меньше) в большинстве сценариев. В производстве мы никогда не должны использовать `text / plain`. ## Ссылки * [UTF-8: Секрет кодирования символов] (http://htmlpurifier.org/docs/enduser-utf8.html) * [Спецификация W3C: отправка форм] (http://www.w3.org /TR/html5/forms.html#attr-fs-enctype) * [Спецификация W3C: Кодировка] (http://www.w3.org/TR/encoding/) * [Спецификация W3C: Определение начальной кодировки] (http: //www.w3.org/TR/html51/syntax.html#the-input-byte-stream) * [StackOverflow: какова граница в multipart / form-data?] (https://stackoverflow.com/questions / 3508338 / что-это-The-граница-в-многоголосных форм-данных)