Почему я должен указывать атрибуты набора символов для тегов <script>? - PullRequest
0 голосов
/ 30 августа 2018

У меня странная ситуация:

  1. Основная HTML-страница обслуживается в кодировке UTF-16 (из-за некоторых требований, выходящих за рамки этого вопроса)
  2. HTML-страница использует <script> теги для загрузки внешних скриптов (т. Е. Они имеют src атрибуты)
  3. Эти внешние скрипты находятся в US-ASCII / UTF-8
  4. Веб-сервер обслуживает сценарии с типом содержимого «application / javascript» без подсказок по набору символов
  5. Скрипты не имеют метки порядка байтов (BOM)

При загрузке страницы, описанной выше, и Firefox, и Chrome (текущие версии) выдают ошибки, говорящие о том, что первый символ файлов скрипта недействителен.

Просмотр вкладок «Сеть» соответствующих представлений dev-tools показывает, что файлы в порядке (они отлично отображаются в программе предварительного просмотра).

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

Поэтому я попытался добавить атрибут charsrt="UTF-8" к тегам <script>, и это, похоже, решило проблему.

Но я действительно не должен был бы этого делать, не так ли?

Прежде всего, сервер сообщает клиенту, какой тип документа. Это application/javascript и не определяет набор символов. (Действительно, RFC говорит, что charset применимо только к text/* MIME-типам). Хорошо, я могу понять, почему там может быть некоторая двусмысленность.

Но тип документа - это javascript, и есть несколько очевидных правил, как обращаться с файлом javascript, чья фактическая кодировка вам неизвестна. Например, если у него есть спецификация, используйте ее. Если нет никакой спецификации, должно быть действительно легко отличить UTF-16 от UTF-8. (Обратите внимание, что на этих же страницах не возникает проблем с загрузкой файлов CSS, которые также находятся в той же ситуации, что и скрипты.)

И, наконец, страница вложения не должна знать, какова кодировка ее зависимостей. Фактически, это может быть невозможно , чтобы он знал, и явно указав charset, затем жестко связал страницу с ее зависимостями и наоборот.

Есть ли способ заставить браузер правильно определять набор символов этих зависимостей без указания charset на самой странице?

1 Ответ

0 голосов
/ 31 августа 2018

Без спецификации в файле или явного charset в <script> или Content-Type для файла кодировка файла неоднозначна. Браузер может предполагать UTF-8 (и должен, согласно RFC 4329 ), но если скрипт содержит какие-либо не-ASCII символы, которые фактически не кодируются в UTF-8, файл не будет обрабатываться должным образом.

Тем не менее, HTML 5, раздел 4.11, предписывает, что резервная кодировка <script> является кодировкой документа, если <script> не имеет атрибута charset. Откат вступает в силу, если нет спецификации или charset для указания фактической кодировки файла.

Таким образом, либо убедитесь, что ваши HTML и JS-файлы всегда используют одну и ту же кодировку, либо вы должны явно указать charset файла JS, так или иначе.

...