59 lines
1.5 KiB
JavaScript
59 lines
1.5 KiB
JavaScript
|
function decodeBase64(base64Str) {
|
||
|
try {
|
||
|
// 第一步:先 URL 解码(解决 %2B、%3D 等问题)
|
||
|
const urlDecoded = decodeURIComponent(base64Str);
|
||
|
|
||
|
// 第二步:处理 Base64 字符(替换 URL 安全字符)
|
||
|
let safeBase64 = urlDecoded
|
||
|
.replace(/-/g, "+")
|
||
|
.replace(/_/g, "/")
|
||
|
.replace(/\s/g, "");
|
||
|
|
||
|
// 补全等号
|
||
|
const pad = safeBase64.length % 4;
|
||
|
safeBase64 = safeBase64.padEnd(
|
||
|
safeBase64.length + (pad ? 4 - pad : 0),
|
||
|
"="
|
||
|
);
|
||
|
|
||
|
// 第三步:使用微信小程序提供的 base64 解码函数
|
||
|
const arrayBuffer = wx.base64ToArrayBuffer(safeBase64);
|
||
|
const bytes = new Uint8Array(arrayBuffer);
|
||
|
|
||
|
// 第四步:手动 UTF-8 解码
|
||
|
let utf8Str = "";
|
||
|
let i = 0;
|
||
|
while (i < bytes.length) {
|
||
|
const byte = bytes[i];
|
||
|
if (byte < 0x80) {
|
||
|
utf8Str += String.fromCharCode(byte);
|
||
|
i++;
|
||
|
} else if (byte < 0xe0) {
|
||
|
utf8Str += String.fromCharCode(
|
||
|
((byte & 0x1f) << 6) | (bytes[i + 1] & 0x3f)
|
||
|
);
|
||
|
i += 2;
|
||
|
} else if (byte < 0xf0) {
|
||
|
utf8Str += String.fromCharCode(
|
||
|
((byte & 0x0f) << 12) |
|
||
|
((bytes[i + 1] & 0x3f) << 6) |
|
||
|
(bytes[i + 2] & 0x3f)
|
||
|
);
|
||
|
i += 3;
|
||
|
} else {
|
||
|
// 四字节字符跳过
|
||
|
i += 4;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return utf8Str;
|
||
|
} catch (e) {
|
||
|
console.error("Base64解码失败:", e);
|
||
|
return "<p>内容解析错误</p>";
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
decodeBase64
|
||
|
};
|