function base64_decode( data ) { // Decodes data encoded with MIME base64
//
// + original by: Tyler Akins (http://rumkin.com)
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
var o1, o2, o3, h1, h2, h3, h4, bits, i=0, enc='';
do { // unpack four hexets into three octets using index points in b64
h1 = b64.indexOf(data.charAt(i++));
h2 = b64.indexOf(data.charAt(i++));
h3 = b64.indexOf(data.charAt(i++));
h4 = b64.indexOf(data.charAt(i++));
bits = h1<<18 | h2<<12 | h3<<6 | h4;
o1 = bits>>16 & 0xff;
o2 = bits>>8 & 0xff;
o3 = bits & 0xff;
if (h3 == 64) enc += String.fromCharCode(o1);
else if (h4 == 64) enc += String.fromCharCode(o1, o2);
else enc += String.fromCharCode(o1, o2, o3);
} while (i < data.length);
return enc;
}
если PHP закадирован через base64, как его раскадировать? незнаете?
Судя по
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
это будет работать только для инглиша, руски будет отбражаться не коректно
Вы не правы, здесь перечислены символы, допустимые в base64-кодировании, а при помощи base64 можно акодировать любые двоичные данные, в том числе и тексты на различных языках и в различных кодировках.
'7vfl7fwg8PPx8ero6SDy5erx8g==' = очень русский текст - кодировка cp1251,
document.write(base64_decode('7vfl7fwg8PPx8ero6SDy5erx8g==')) в результате мусор :
î÷åíü ðóññêèé òåêñò
Ну так это вы же cp1251 использовали.
А получаете на выходе совсем не факт, что такую кодировку.
«î÷åíü ðóññêèé òåêñò» → «очень русский текст» (CP1252 → CP1251)
http://www.artlebedev.ru/tools/decoder/
Да уж, с русским тут действительно траблы!
Но, если реч идёт о Javascript то эту проблему легко решить следующим мокаром:
base64_encode(), добавим в начало выполнения функции data = escape(data);
Изначально зашифруем русский текст.
function base64_encode( data ) { data = escape(data); var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var o1, o2, o3, h1, h2, h3, h4, bits, i=0, enc=''; do { // pack three octets into four hexets o1 = data.charCodeAt(i++); o2 = data.charCodeAt(i++); o3 = data.charCodeAt(i++); bits = o1<<16 | o2<<8 | o3; h1 = bits>>18 & 0x3f; h2 = bits>>12 & 0x3f; h3 = bits>>6 & 0x3f; h4 = bits & 0x3f; // use hexets to index into b64, and append result to encoded string enc += b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4); } while (i < data.length); switch( data.length % 3 ){ case 1: enc = enc.slice(0, -2) + '=='; break; case 2: enc = enc.slice(0, -1) + '='; break; } return enc; } Примеры:Теперь base64_decode()
Позволим функции разкодировать base64, мы получим наш зашифрованый escape()
Перед тем как вернуть return enc; разшифруем
return unescape(enc);
function base64_decode( data ) { var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; var o1, o2, o3, h1, h2, h3, h4, bits, i=0, enc=''; do { h1 = b64.indexOf(data.charAt(i++)); h2 = b64.indexOf(data.charAt(i++)); h3 = b64.indexOf(data.charAt(i++)); h4 = b64.indexOf(data.charAt(i++)); bits = h1<<18 | h2<<12 | h3<<6 | h4; o1 = bits>>16 & 0xff; o2 = bits>>8 & 0xff; o3 = bits & 0xff; if (h3 == 64) enc += String.fromCharCode(o1); else if (h4 == 64) enc += String.fromCharCode(o1, o2); else enc += String.fromCharCode(o1, o2, o3); } while (i < data.length); return unescape(enc); }Функции действительно некорректно работают для кирилических языков. Это легко проверить вызвал по очереди енкод и декод для строки русского языка в кодировке KOI8 или CP-1251
btoa()/atob()
в любом браузере кроме IE
Отправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.