Какая кодировка используется String.fromCharCode?Javascript

Форум по Javascript
Ответить
Anonymous
 Какая кодировка используется String.fromCharCode?

Сообщение Anonymous »

Я использую btoa для кодирования Uint8Array в строку base 64. И я столкнулся со странным случаем. Это работает:
export function toBase64(data: Uint8Array): string {
return btoa(String.fromCharCode(...data))
}

А это не так (btoa часто жалуется на неизвестный символ):
export function toBase64(data: Uint8Array): string {
return btoa(new TextDecoder('latin1').decode(data))
}

Вопрос
Какую кодировку следует использовать с TextDecoder, чтобы создать ту же строку, что и с помощью fromCharCode?
Справочная информация
При объединении различной документации должно быть верно следующее:
  • btoa ожидает кодировку Latin1
  • String.fromCharCode преобразует отдельные целые числа в соответствующий символ utf16
  • для первых 256 символов latin1 и utf16, которые перекрываются
Тест
Проведя несколько экспериментов, становится ясно, что два подхода дают разные строки. При такой настройке:
const array = Array.from({ length: 256 }, (_, i) => I);
const d = new Uint8Array(array);

Выполняется:
String.fromCharCode(...d)

даствы
\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F !"#$%&\'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

Во время работы:
(new TextDecoder('latin1')).decode(d)

даствы
\x00\x01\x02\x03\x04\x05\x06\x07\b\t\n\v\f\r\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F !"#$%&\'()*+,-./0123456789:;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7F€\x81‚ƒ„…†‡ˆ‰Š‹Œ\x8DŽ\x8F\x90‘’“”•–—˜™š›œ\x9DžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ

Там, где они существенно различаются в диапазоне 7F–9F (скопировано ниже для ясности)
\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F

\x7F€\x81‚ƒ„…†‡ˆ‰Š‹Œ\x8DŽ\x8F\x90‘’“”•–—˜™š›œ\x9DžŸ


Подробнее здесь: https://stackoverflow.com/questions/793 ... omcharcode
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»