У меня есть сценарий PHP, который может кодировать изображение PNG в строку Base64.
Я хотел бы сделать то же самое, используя JavaScript. Я знаю, как открыть файлы, но я не уверен, как сделать кодировку. Я не привык работать с двоичными данными.
javascript
base64
имя пользователя
источник
источник
Ответы:
Вы можете использовать
btoa()
иatob()
для преобразования в и из кодировки base64.Кажется, что в комментариях есть некоторая путаница относительно того, что эти функции принимают / возвращают, так что…
btoa()
принимает «строку», где каждый символ представляет 8-битный байт - если вы передадите строку, содержащую символы, которые не могут быть представлены в 8 битах, она, вероятно, сломается . Это не проблема, если вы на самом деле обрабатываете строку как байтовый массив, но если вы пытаетесь сделать что-то еще, вам придется сначала ее кодировать.atob()
возвращает «строку», где каждый символ представляет 8-битный байт, то есть его значение будет между0
и0xff
. Это не означает, что это ASCII - возможно, если вы вообще используете эту функцию, вы ожидаете работать с двоичными данными, а не с текстом.Смотрите также:
источник
btoa(unescape(encodeURIComponent(str))))
если str UFT8Отсюда :
Кроме того, поиск по «javascript base64 encoding» включает множество других опций, выше был первый.
источник
string = string.replace(/\r\n/g,"\n");
оператор в методе кодирования utf8.string = string.replace(/\r\n/g,"\n");
, лол. Это как «о, давайте закодируем эту строку, но сначала, почему бы нам не сделать случайную нормализацию всех разрывов строк без какой-либо веской причины». Это должно быть абсолютно исключено из класса при любых обстоятельствах.enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
. В моем браузере это работает нормально,NaN>>4
равно 0, но я не знаю, все ли браузеры делают это (такжеNaN/16
равно NaN).Internet Explorer 10+
Кросс-браузер
jsFiddle
с Node.js
Вот как вы кодируете обычный текст в base64 в Node.js:
А вот как вы декодируете строки в кодировке base64:
с Dojo.js
Чтобы кодировать массив байтов с помощью dojox.encoding.base64:
Чтобы декодировать строку в кодировке base64:
Bower установить angular-base64
источник
Код Санни великолепен, за исключением того, что он ломается в IE7 из-за ссылок на «это». Исправлено заменой таких ссылок на «Base64»:
источник
Вы можете использовать
btoa
(для базы-64) иatob
(от базы-64).Для IE 9 и ниже попробуйте плагин jquery-base64 :
источник
base64.encode(...)
иbase64.decode(...)
... присоединяйте его к jQuery, когда он имеет нулевую функциональность, специфичную для jQuery, абсолютно бессмысленно ...Из комментариев (от SET и Стефана Штайгера) ниже принятого ответа приведен краткий обзор того, как кодировать / декодировать строку в / из base64 без необходимости в библиотеке.
демонстрация
(использует библиотеку jQuery, но не для кодирования / декодирования)
Показать фрагмент кода
источник
Buffer.from(b64data, 'base64').toString();
В обеих реализациях есть пара ошибок
_utf8_decode
.c1
иc2
назначаются как глобальные переменные из-за неправильного использованияvar
оператора иc3
не инициализируются и не объявляются вообще.Это работает, но эти переменные будут перезаписывать любые существующие с тем же именем вне этой функции.
Вот версия, которая этого не сделает:
источник
Я добавил +1 к ответу Санни, но я хотел бы внести несколько изменений, которые я сделал для своего собственного проекта, на случай, если кто-нибудь посчитает его полезным. По сути, я просто немного очистил исходный код, чтобы JSLint не жаловался на это, и сделал методы, помеченные как приватные, в комментариях на самом деле приватными. Я также добавил два метода, которые мне нужны в моем собственном проекте, а именно
decodeToHex
иencodeFromHex
.Код:
источник
Для новых браузеров кодировать Uint8Array в строку и декодировать строку в Uint8Array.
Для Node.js вы можете использовать следующее для кодирования строки, буфера или Uint8Array в строку и декодирования из строки, буфера или Uint8Array в буфер.
источник
Чтобы сделать String URL в кодировке Base64 дружественным, в JavaScript вы можете сделать что-то вроде этого:
Смотрите также эту скрипку: http://jsfiddle.net/magikMaker/7bjaT/
источник
encodeURIComponent
может привести к превосходному результату с меньшими затратами усилий со стороны разработчика.Обратите внимание, что это не подходит для необработанных строк Unicode! Смотрите раздел Юникод здесь .
Синтаксис для кодирования
var encodedData = window.btoa(stringToEncode);
Синтаксис для декодирования
var decodedData = window.atob(encodedData);
источник
Я переписал вручную эти методы кодирования и декодирования, за исключением шестнадцатеричного, в модульный формат для кроссплатформенности / совместимости с браузерами, а также с реальной частной областью видимости, и использует,
btoa
иatob
если они существуют из-за скорости, а не использования своя собственная кодировка:https://gist.github.com/Nijikokun/5192472
Применение:
источник
Этот вопрос и его ответы указали мне правильное направление.
Тем более с юникодом атоб и бтоа нельзя использовать "ваниль" и в наши дни ВСЕ это юникод ..
Непосредственно из Mozilla, две хорошие функции для этой цели (протестировано с тегами Юникод и html внутри)
Эти функции будут работать молниеносно по сравнению с необработанным декодированием base64 с использованием пользовательской функции javascript, так как btoa и atob выполняются вне интерпретатора.
Если вы можете игнорировать старый IE и старые мобильные телефоны (например, iphone 3?), Это должно быть хорошим решением.
источник
если вам нужно закодировать объект изображения HTML, вы можете написать простую функцию, например:
Чтобы получить base64 изображения по id:
больше здесь
источник
Содействие с уменьшенным polyfill для
window.atob
+,window.btoa
который я в настоящее время использую.источник
Я бы предпочел использовать методы кодирования / декодирования bas64 от CryptoJS , самой популярной библиотеки для стандартных и безопасных криптографических алгоритмов, реализованных в JavaScript с использованием лучших практик и шаблонов.
источник
Вот версия AngularJS Factory @ user850789:
источник
Мне нужно было кодирование строки UTF-8 как base64 для моего проекта. Кажется, что большинство ответов здесь неправильно обрабатывают суррогатные пары UTF-16 при преобразовании в UTF-8, поэтому для завершения я опубликую свое решение:
Обратите внимание, что код не был тщательно протестирован. Я протестировал некоторые входные данные, включая такие, как
strToUTF8Base64('衠衢蠩蠨')
и сравнивал с выходными данными онлайн-инструмента кодирования ( https://www.base64encode.org/ ).источник
Для моего проекта мне все еще нужно поддерживать IE7 и работать с большим вводом для кодирования.
Основываясь на коде, предложенном Джо Диндейлом и предложенном Мариусом в комментарии, можно улучшить производительность с IE7, построив результат с массивом вместо строки.
Вот пример для кодирования:
источник
Немного больше работы, если вы хотите высокопроизводительное нативное решение, есть некоторые функции HTML5, которые вы можете использовать.
Если вы можете поместить свои данные в
Blob
, то вы можете использовать функцию FileReader.readAsDataURL (), чтобы получитьdata://
URL-адрес и отрубить его переднюю часть, чтобы получить данные base64.Возможно, вам придется выполнить дальнейшую обработку, чтобы urldecode данных, так как я не уверен,
+
экранированы ли символы дляdata://
URL, но это должно быть довольно тривиально.источник
Что ж, если вы используете dojo, это дает нам прямой способ кодирования или декодирования в base64.
Попробуй это:-
Чтобы кодировать массив байтов с помощью dojox.encoding.base64:
Чтобы декодировать строку в кодировке base64:
источник
Вы можете использовать
window.btoa
иwindow.atob
...Вероятно, использование способа, которым является MDN , может сделать вашу работу лучше всего ... Также принимая Unicode ... используя эти две простые функции:
источник
Вот ЖИВОЙ DEMO из
atob()
иbtoa()
JS встроенных функций:источник
Использовать библиотеку js-base64 как
источник