2010-09-23 77 views
20

Tôi đang cố triển khai một tập lệnh đơn giản trên một trang web sẽ trả về thông tin mã hóa base64 từ API ajax của google. Đây là những gì tôi đang chơi với cho đến nay:Cách mã hóa base64 bên trong javascript

<html> 
<head> 
<script src="http://www.google.com/jsapi?key=ABQIAAAA0duujonFsEX871htGWZBHRS76H0qhS7Lb-D1Gd0Mnaiuid8Z7BQIyz2kMpojKizoyiCQA4yRkKAKug" type="text/javascript"></script> 
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
<script type="text/javascript"> 
    jQuery(document).ready(function() { 
    var location = 'Unable to determine your location.'; 
    if (google.loader.ClientLocation) { 
     var loc = google.loader.ClientLocation; 
     location = 'Country: <strong>' + loc.address.country + '</strong>, Region: <strong>' + loc.address.region + '</strong>, City: <strong>' + 
       loc.address.city + '</strong>, Lat/Long: <strong>' + loc.latitude + ', ' + loc.longitude + '</strong>'; 
    } 
    jQuery('.geolocation').html(location); 
    }); 
</script> 
</head> 
<body> 
<span class="geolocation"></span> 
</body> 
</html> 

Nó trả về thông tin tôi đang cố gắng để có được đúng, nhưng tôi cần phải base64 mã hóa các phần riêng biệt như nước, vùng, thành phố lat và kinh độ. Trong php nó sẽ được đơn giản, nhưng tôi không thể tìm ra cách để làm điều đó trong javascript. Bất kỳ trợ giúp sẽ được đánh giá cao.

+1

bản sao có thể có của [Làm cách nào bạn có thể mã hóa thành Base64 bằng Javascript?] (Http://stackoverflow.com/questions/246801/how-can-you-encode-to-base64-using-javascript) –

Trả lời

15

This answer dường như khớp với những gì bạn đang tìm kiếm.

Ngoài ra còn có this one đó là tao nhã hơn:

/** 
* 
* Base64 encode/decode 
* http://www.webtoolkit.info/ 
* 
**/ 

var Base64 = { 

    // private property 
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/=", 

    // public method for encoding 
    encode : function (input) { 
     var output = ""; 
     var chr1, chr2, chr3, enc1, enc2, enc3, enc4; 
     var i = 0; 

     input = Base64._utf8_encode(input); 

     while (i < input.length) { 

      chr1 = input.charCodeAt(i++); 
      chr2 = input.charCodeAt(i++); 
      chr3 = input.charCodeAt(i++); 

      enc1 = chr1 >> 2; 
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 
      enc4 = chr3 & 63; 

      if (isNaN(chr2)) { 
       enc3 = enc4 = 64; 
      } else if (isNaN(chr3)) { 
       enc4 = 64; 
      } 

      output = output + 
      this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) + 
      this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4); 

     } 

     return output; 
    }, 

    // public method for decoding 
    decode : function (input) { 
     var output = ""; 
     var chr1, chr2, chr3; 
     var enc1, enc2, enc3, enc4; 
     var i = 0; 

     input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 

     while (i < input.length) { 

      enc1 = this._keyStr.indexOf(input.charAt(i++)); 
      enc2 = this._keyStr.indexOf(input.charAt(i++)); 
      enc3 = this._keyStr.indexOf(input.charAt(i++)); 
      enc4 = this._keyStr.indexOf(input.charAt(i++)); 

      chr1 = (enc1 << 2) | (enc2 >> 4); 
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 
      chr3 = ((enc3 & 3) << 6) | enc4; 

      output = output + String.fromCharCode(chr1); 

      if (enc3 != 64) { 
       output = output + String.fromCharCode(chr2); 
      } 
      if (enc4 != 64) { 
       output = output + String.fromCharCode(chr3); 
      } 

     } 

     output = Base64._utf8_decode(output); 

     return output; 

    }, 

    // private method for UTF-8 encoding 
    _utf8_encode : function (string) { 
     string = string.replace(/\r\n/g,"\n"); 
     var utftext = ""; 

     for (var n = 0; n < string.length; n++) { 

      var c = string.charCodeAt(n); 

      if (c < 128) { 
       utftext += String.fromCharCode(c); 
      } 
      else if((c > 127) && (c < 2048)) { 
       utftext += String.fromCharCode((c >> 6) | 192); 
       utftext += String.fromCharCode((c & 63) | 128); 
      } 
      else { 
       utftext += String.fromCharCode((c >> 12) | 224); 
       utftext += String.fromCharCode(((c >> 6) & 63) | 128); 
       utftext += String.fromCharCode((c & 63) | 128); 
      } 

     } 

     return utftext; 
    }, 

    // private method for UTF-8 decoding 
    _utf8_decode : function (utftext) { 
     var string = ""; 
     var i = 0; 
     var c = c1 = c2 = 0; 

     while (i < utftext.length) { 

      c = utftext.charCodeAt(i); 

      if (c < 128) { 
       string += String.fromCharCode(c); 
       i++; 
      } 
      else if((c > 191) && (c < 224)) { 
       c2 = utftext.charCodeAt(i+1); 
       string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); 
       i += 2; 
      } 
      else { 
       c2 = utftext.charCodeAt(i+1); 
       c3 = utftext.charCodeAt(i+2); 
       string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); 
       i += 3; 
      } 

     } 

     return string; 
    } 

} 
+0

Trông như vậy hứa hẹn, nhưng nó là một chút trong chiều sâu của tôi trong javascript. Có lẽ tôi có thể tìm cách để làm tất cả điều này trong php thay vì – Mike

+0

kiểm tra ý kiến ​​[ở đây] (http://stackoverflow.com/a/246813/5090771) trước khi sử dụng ... – WhiteHat

20

Mozilla, WebKit và Opera đều có btoa()atob() chức năng cho cơ sở 64 mã hóa và giải mã tương ứng. Sử dụng những nơi có thể vì chúng hầu như chắc chắn sẽ nhanh hơn rất nhiều so với việc triển khai JavaScript và quay trở lại một trong nhiều tập lệnh bật lên khi bạn thực hiện a web search.

CHỈNH SỬA 10 THÁNG 9 NĂM 2013: atob()btoa() không xử lý các ký tự Unicode ngoài phạm vi ASCII. MDN có workarounds nhưng tôi không thể xác minh cho chúng. Nhờ @larspars để chỉ ra điều này.

Ví dụ, nếu bạn đang sử dụng ví dụ từ câu trả lời amphetamachine, bạn có thể làm như sau:

if (!window.btoa) { 
    window.btoa = function(str) { 
     return Base64.encode(str); 
    } 
} 

if (!window.atob) { 
    window.atob = function(str) { 
     return Base64.decode(str); 
    } 
} 

alert(btoa("Some text")); 
+1

Lưu ý rằng atob và btoa sẽ không xử lý unicode , trong khi câu trả lời của @ amphetamachine sẽ. Base64.mã hóa ('☃') hoạt động, trong khi btoa ('☃') ném một lỗi (thử nghiệm trong Firefox, Chrome và Opera) – larspars

+0

Vẫn còn nghi ngờ về việc nên sử dụng nó, nhưng bây giờ tôi nghĩ rằng tôi sẽ. Chúng tôi không có các nhân vật lạ khi chúng tôi làm việc với ngôn ngữ Hà Lan. Cảm ơn bạn đã đăng bài và chỉnh sửa nhận xét của mình, điều này đã giúp rất nhiều trong việc quyết định! ;) – ReSpawN

0

tôi có một phần của mã từ câu trả lời ở đây:

https://scotch.io/quick-tips/how-to-encode-and-decode-strings-with-base64-in-javascript

và một phần khác từ câu trả lời trên trang này: https://stackoverflow.com/a/3776796/2655623

và đây là kết quả:

var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/\r\n/g,"\n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}} 

window.btoa = function(str) { 
    return Base64.encode(str); 
} 

window.atob = function(str) { 
    return Base64.decode(str); 
} 

Vì đây giữ mọi thứ ở một nơi, tôi sẽ không liên quan đến bản thân mình với cách window.atb/window.btoa đóng vai trò khác nhau trong các trình duyệt khác nhau.

0

IE 10 & trên và tất cả các trình duyệt mới nhất

Mã hóa chuỗi

var str = "raj"; 
var enc = window.btoa(str); // cmFq 

Giải mã chuỗi

var dec = window.atoa('cmFq'); // raj 

Hoặc nếu không bạn có thể có chức năng riêng của bạn trên trang. small blog with references

Các vấn đề liên quan