一定是我哪里 SB 了,为什么 NodeJS 用这段代码转的 base64 和浏览器的 btoa 不同?

2017-03-07 13:42:34 +08:00
 doubleflower

Node:

> Buffer.from('~!@').toString('base64')
'fiFA'

Browser:

> btoa('!@#')
"IUAj"

看不出有问题啊,黑人问号中...

5197 次点击
所在节点    Node.js
16 条回复
Zzzzzzzzz
2017-03-07 13:44:55 +08:00
因为上下两个引号里的东西都不一样啊.....
dzxx36gyy
2017-03-07 13:46:36 +08:00
……
Jaylee
2017-03-07 13:47:16 +08:00
水逼
zhidian
2017-03-07 13:47:31 +08:00
哎……你在钓鱼吗?输入就不一样。
doubleflower
2017-03-07 13:48:22 +08:00
尼马! 我就说我一定是哪里 SB 了,被这问题搞了半个小时。
DlYgod
2017-03-07 14:22:34 +08:00
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
doubleflower
2017-03-07 14:25:32 +08:00
@Zzzzzzzzz
@dzxx36gyy
@Jaylee
@zhidian

唉,又过了 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 的问题单独提出来试了一下还不小心写错了测试字串。
iminto
2017-03-07 16:21:17 +08:00
兜售近视眼镜
123s
2017-03-07 16:39:38 +08:00
我一眼就看到了,原来我被钓鱼了
guokeke
2017-03-07 16:41:04 +08:00
( ´Д`)y━・~~
wyntergreg
2017-03-07 17:10:34 +08:00
两次输入按键盘按跑偏了,一次从·开始,一次从 1 开始
50vip
2017-03-07 17:25:00 +08:00
多年不笑的我,这次笑了~~~
foru17
2017-03-07 17:26:36 +08:00
笑了一个下午。
hisway
2017-03-07 17:49:27 +08:00
呵呵~
cloudzqy
2017-03-07 19:40:28 +08:00
哈哈哈哈,我真笑了
neurocomputing
2017-03-07 20:25:23 +08:00
哈哈哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/345558

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX