JS — Когда используется TextEncoder().кодирование отличается от массива, созданного из кодировки каждого символа

#javascript #character-encoding

Вопрос:

Читая документацию в MDN, в ней говорится

Метод TextEncoder.prototype.encode() принимает USVString в качестве входных данных и возвращает Uint8Array, содержащий текст, заданный в параметрах, закодированных с помощью определенного метода для этого объекта TextEncoder.

С другой стороны, в приведенном ниже коде каждый символ в строке преобразуется в его значение в Юникоде и помещается в массив.

 Uint8Array.from(
  Array.from(value)
    .map((letter) => 
         letter.charCodeAt(0)
    ) 
)
 

Часто два метода приводят к одному и тому же результату, но иногда TextEncoder генерируется более длинный TypedArray, особенно когда кодируемая строка представляет собой декодированный ключ шифрования.

Интересно, почему это так? Связано ли это с преобразованием из начальной строки JS в USVString? Или, возможно, разные схемы кодирования?

Комментарии:

1. в сторону: .map() встроен в [].from() качестве 2-го аргумента, поэтому Array.from(value, x=>x.charCodeAt(0)) делает то же самое, но короче…

2. Спасибо @dandavis — Со всеми этими строками, массивами и буферами я полагаюсь на копирование кода из Интернета: P