提问人:Ryan 提问时间:2/11/2023 更新时间:2/14/2023 访问量:1192
Buffer.from(base64EncodedString, 'base64').toString('binary') 与 'utf8'
Buffer.from(base64EncodedString, 'base64').toString('binary') vs 'utf8'
问:
在 Node.js 中:为什么此测试在第二次调用时失败?main
test('base64Encode and back', () => {
function main(input: string) {
const base64string = base64Encode(input);
const text = base64Decode(base64string);
expect(input).toEqual(text);
}
main('demo');
main('😉😉😉');
});
以下是我的功能:
export function base64Encode(text: string): string {
const buffer = Buffer.from(text, 'binary');
return buffer.toString('base64');
}
export function base64Decode(base64EncodedString: string): string {
const buffer = Buffer.from(base64EncodedString, 'base64');
return buffer.toString('binary');
}
从这些页面中,我认为我已经正确地编写了这些函数,以便一个函数可以反转另一个函数:
- https://github.com/node-browser-compat/btoa/blob/master/index.js
- https://github.com/node-browser-compat/atob/blob/master/node-atob.js
- https://stackoverflow.com/a/47890385/470749
如果我将选项更改为改为,则测试通过。'binary'
'utf8'
但是我的数据库目前有数据,这个函数似乎只有在我使用 .'binary'
答:
3赞
Matt
2/14/2023
#1
'latin1'
:Latin-1 代表 ISO-8859-1。此字符编码仅支持 from to 的 Unicode 字符。每个字符都使用单个字节进行编码。不适合该范围的字符将被截断,并将映射到该范围内的字符。U+0000
U+00FF
此字符集无法显示多字节 utf8 字符。
要取回 utf8 多字节字符,请直接转到并再次返回base64
function base64Encode(str) {
return Buffer.from(str).toString('base64')
}
function base64Decode(str) {
return Buffer.from(str, 'base64').toString()
}
> base64Encode('😉')
'8J+YiQ=='
> base64Decode('8J+YiQ==')
'😉'
评论
latin1
/binary
字符集时,它不能再表示😉多字节 utf8 字符。Buffer.from(text, 'binary')
buffer.toString('binary')
string
Buffer
base64
latin
binary
'binary'
'utf8'