Подтвердить что ты не робот

Кодировка символов Javascript по умолчанию?

После некоторого безумного Googling я не могу найти окончательного ответа на простой вопрос. Я прошу прощения, если на этот вопрос ответят где-то, но если так, я не смог его найти.

При написании метода шифрования в Javascript мне стало интересно, какой символ кодирует мои строки, и почему.

Итак: что определяет кодировку символов в Javascript? Это стандарт? В браузере? Определяется заголовком HTTP-запроса? В теге <META> HTML, который его охватывает? Сервер, который передает страницу?

По моему эмпирическому тестированию (изменение разных настроек, а затем использование charCodeAt на достаточно странном характере и видя, какая кодировка соответствует значению), он всегда выглядит как UTF-8 или UTF-16, но я не конечно, почему.

Спасибо за помощь!

4b9b3361

Ответ 1

Раздел 8.4 E262:

Тип String - это совокупность всех конечных упорядоченных последовательностей из нуля или более 16-разрядных целых значений без знака ( "элементы" ). Тип String обычно используется для представления текстовых данных в запущенной программе ECMAScript, и в этом случае каждый элемент в String рассматривается как значение кода (см. Раздел 6). Каждый элемент считается занимающим позицию в последовательности. Эти позиции индексируются с неотрицательными целыми числами. Первый элемент (если есть) находится в позиции 0, следующий элемент (если есть) в позиции 1 и т.д. Длина строки - это количество элементов (то есть 16-битных значений) внутри нее. Пустая строка имеет длину ноль и поэтому не содержит элементов.

Когда строка содержит фактические текстовые данные, каждый элемент считается единым модулем кода UTF-16. Независимо от того, является ли это фактическим форматом хранения строки, символы внутри строки нумеруются по их исходной позиции элемента кода, как если бы они были представлены с использованием UTF-16. Все операции над строками (кроме как указано иначе) рассматривают их как последовательности недифференцированных 16-разрядных целых без знака; они не гарантируют, что результирующая Строка находится в нормализованной форме, и они не гарантируют языковых результатов.

Эта формулировка носит своеобразный характер; это означает, что все, что считается, обрабатывает строки так, как будто каждый символ является символом UTF-16, но в то же время ничто не гарантирует, что все это будет действительным.

edit — чтобы быть ясным, намерение состоит в том, что строки состоят из кодовых точек UTF-16. В ES2015 определение "строковое значение" включает эту заметку:

Значение String является членом типа String. Каждое целое значение в последовательности обычно представляет собой одну 16-битную единицу текста UTF-16. Однако ECMAScript не устанавливает никаких ограничений или требований к значениям, за исключением того, что они должны быть 16-разрядными целыми без знака.

Таким образом, строка все еще является строкой, даже если она содержит значения, которые не работают как правильные символы Unicode.

Ответ 2

Для JavaScript не существует кодировки символов по умолчанию. Программа JavaScript, в отношении спецификаций, представляет собой последовательность абстрактных символов. При передаче по сети или просто хранении на компьютере абстрактные символы должны быть каким-то образом закодированы, но механизмы для него не контролируются стандартом ECMAScript.

В разделе 6 стандарта ECMAScript используется UTF-16 в качестве эталонной кодировки, но не назначает его по умолчанию. Использование UTF-16 в качестве ссылки логически не нужно (достаточно было бы указать номера Unicode), но, вероятно, предполагалось, что это поможет людям.

Эта проблема не следует путать с интерпретацией строковых литералов или строк в целом. Буква, подобная "Φ", должна быть в некоторой кодировке вместе с остальной частью программы; это может быть любая кодировка, но после того, как кодировка была разрешена, литерал будет интерпретироваться как целое число в соответствии с номером Unicode символа.

Когда программа JavaScript передается как таковая (как "внешний файл JavaScript" ) через Интернет, применяется RFC 4329, Scripting Media Types. Параграф 4 определяет механизм: прежде всего проверяются заголовки, такие как заголовки HTTP, а параметр charset - доверять. (На практике веб-серверы обычно не указывают такой параметр для программ JavaScript.) Во-вторых, применяется обнаружение спецификации. В противном случае подразумевается UTF-8.

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

Если программа JavaScript появляется как встроенная в HTML, либо через элемент script, либо какой-либо атрибут события, то его кодировка символов, конечно, такая же, как и в документе HTML. Раздел Указание кодировки символов спецификации HTML 4.01 определяет механизм разрешения в следующем порядке: charset в заголовке HTTP, charset в meta, charset в ссылке, которая использовалась для доступа к документу, и, наконец, эвристики (догадки), которые могут включать в себя много вещей; ср к сложному механизму разрешения в проекте HTML5.