Site icon 时鹏亮的Blog

JavaScript 如何实现 PHP的 base64_encode 函数

最近做网络通信,发现JS的base64的一些实现在特殊字符上和PHP的不一致,索性搜了下是否能让JavaScript 如何实现 PHP的 base64_encode 函数。印象里之前是有个大佬专门写过的,一搜,确实存在,函数如下:

module.exports = function base64_encode(stringToEncode) {
// discuss at: https://locutus.io/php/base64_encode/
// original by: Tyler Akins (https://rumkin.com)
// improved by: Bayron Guevara
// improved by: Thunder.m
// improved by: Kevin van Zonneveld (https://kvz.io)
// improved by: Kevin van Zonneveld (https://kvz.io)
// improved by: Rafa? Kukawski (https://blog.kukawski.pl)
// bugfixed by: Pellentesque Malesuada
// improved by: Indigo744
// example 1: base64_encode('Kevin van Zonneveld')
// returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
// example 2: base64_encode('a')
// returns 2: 'YQ=='
// example 3: base64_encode('? à la mode')
// returns 3: '4pyTIMOgIGxhIG1vZGU='

// encodeUTF8string()
// Internal function to encode properly UTF8 string
// Adapted from Solution #1 at https://developer.mozilla.org/en-US/docs/Web/API/WindowBase64/Base64_encoding_and_decoding
const encodeUTF8string = function (str) {
// first we use encodeURIComponent to get percent-encoded UTF-8,
// then we convert the percent encodings into raw bytes which
// can be fed into the base64 encoding algorithm.
return encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function toSolidBytes(match, p1) {
return String.fromCharCode('0x' + p1)
})
}

if (typeof window !== 'undefined') {
if (typeof window.btoa !== 'undefined') {
return window.btoa(encodeUTF8string(stringToEncode))
}
} else {
return new Buffer(stringToEncode).toString('base64')
}

const b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
let o1
let o2
let o3
let h1
let h2
let h3
let h4
let bits
let i = 0
let ac = 0
let enc = ''
const tmpArr = []

if (!stringToEncode) {
return stringToEncode
}

stringToEncode = encodeUTF8string(stringToEncode)

do {
// pack three octets into four hexets
o1 = stringToEncode.charCodeAt(i++)
o2 = stringToEncode.charCodeAt(i++)
o3 = stringToEncode.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
tmpArr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4)
} while (i < stringToEncode.length)

enc = tmpArr.join('')

const r = stringToEncode.length % 3

return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3)
}

参考资料

PHP’s base64_encode in JavaScript


如您从本文得到了有价值的信息或帮助,请考虑扫描文末二维码捐赠和鼓励。

尊重他人劳动成果。转载请务必附上原文链接,我将感激不尽。


与《JavaScript 如何实现 PHP的 base64_encode 函数》相关的博文:

Exit mobile version