Nodejs疑问:一定是我哪里 SB 了,为什么 NodeJs 用这段代码转的 base64 和浏览器的 btoa 不同?
Nodejs疑问:一定是我哪里 SB 了,为什么 NodeJs 用这段代码转的 base64 和浏览器的 btoa 不同?
Node:
> Buffer.from('~!@').toString('base64')
'fiFA'
Browser:
> btoa('!@#')
"IUAj"
看不出有问题啊,黑人问号中...
因为上下两个引号里的东西都不一样啊…
……
水逼
哎……你在钓鱼吗?输入就不一样。
尼马! 我就说我一定是哪里 SB 了,被这问题搞了半个小时。
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
唉,又过了 10 分钟,才发现代码里的一个 escape 写反错误,是我问错了地方。
其实出问题的是这个小转码库:
function fwescape(s) {
return s == null ? s : reverse(b64encode(unescape(encodeURIComponent(s))))
}
function fwunescape(s) {
return s == null ? s : decodeURIComponent(escape(b64decode(reverse(s))))
}
function reverse(s) {
return s.split(’’).reverse().join(’’)
}
function b64encode(s) {
return typeof btoa === ‘undefined’ ? Buffer.from(s).toString(‘base64’) : btoa(s)
}
function b64decode(s) {
return typeof atob === ‘undefined’ ? Buffer.from(s, ‘base64’).toString() : atob(s)
}
fwunescape(fwescape(‘abc 我是谁😸’)) === 'abc 我是谁😸’
主要搞的地方在于,这段代码分别能通过前端浏览器里和后端 NodeJS 里的单元测试!
但是前后端互转英文没问题中文乱码,然后我怀疑是 base64 的问题单独提出来试了一下还不小心写错了测试字串。
我一眼就看到了,原来我被钓鱼了
( ´Д`)y━・~~
两次输入按键盘按跑偏了,一次从·开始,一次从 1 开始
多年不笑的我,这次笑了~~~
笑了一个下午。
呵呵~
哈哈哈哈,我真笑了
哈哈哈哈
在 Node.js 和浏览器环境中进行 Base64 编码时,确实可能会遇到不同的结果,这通常是因为输入数据的处理方式不同。以下是一些可能的原因和解决方法:
-
字符编码: Node.js 中的
Buffer
类默认使用 UTF-8 编码,而btoa
函数在浏览器中期望输入一个拉丁1(ISO-8859-1)编码的字符串。如果输入包含非拉丁1字符,两者结果可能会不同。// Node.js const buffer = Buffer.from('你好,世界', 'utf8'); const base64Node = buffer.toString('base64'); console.log(base64Node); // 输出:5L2g5aW977yM5LiW55WM // 浏览器 const str = '你好,世界'; const base64Browser = btoa(unescape(encodeURIComponent(str))); console.log(base64Browser); // 输出与 Node.js 可能不同,因为编码不同
-
换行符: Node.js 和浏览器处理换行符(
\n
和\r\n
)的方式也可能不同,这会影响 Base64 编码的结果。 -
空格和特殊字符: 确保输入字符串在 Node.js 和浏览器中完全一致,没有额外的空格或特殊字符。
为了确保两者结果一致,你可以在 Node.js 中使用与浏览器相同的编码方式,或者对输入字符串进行预处理,以确保它们具有相同的字符集。上面的代码示例展示了如何在浏览器中对非拉丁1字符进行编码,以匹配 Node.js 的 UTF-8 编码。