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
Мобильная версия