Javascript Go和Node.js base64编码、解码问题

Javascript Go和Node.js base64编码、解码问题,javascript,go,base64,Javascript,Go,Base64,我在Go中对字符串进行base64编码 然后用javascript解码(我尝试了3种不同的方法) 我无法获得与原始Go字符串匹配的javascript结果 转到(编码) js(解码) 所有3种方法均失败,即a1!=a、 a2!=a、 a3!=a 我假设base64编码/解码会很简单 我错过了什么?谢谢 编辑:js代码有一个“输入错误”-但问题仍然存在,ai!=a、 甚至a1!=a2==a3 编辑:如果原始a很简单,那么一切都正常。但是当a包含不可打印的字符时,我无法在js中解码 工作原理示例:

我在Go中对字符串进行base64编码

然后用javascript解码(我尝试了3种不同的方法)

我无法获得与原始Go字符串匹配的javascript结果

转到(编码)

js(解码)

所有3种方法均失败,即a1!=a、 a2!=a、 a3!=a

我假设base64编码/解码会很简单

我错过了什么?谢谢

编辑:js代码有一个“输入错误”-但问题仍然存在,ai!=a、 甚至a1!=a2==a3

编辑:如果原始a很简单,那么一切都正常。但是当a包含不可打印的字符时,我无法在js中解码 工作原理示例: a:=[]字节{65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65} 在这里它不起作用: a:=[]字节{138,65,65,65,65,65,65,65,65,65,65,65,65,65,65,65}

来自:

UTF8不应用于存储任意二进制数据,因为它是字符串编码格式,而不是二进制编码格式

因此,不要使用utf8相关函数转换原始(非utf8)二进制数据。

来自:

UTF8不应用于存储任意二进制数据,因为它是字符串编码格式,而不是二进制编码格式


因此,不要使用utf8相关函数来转换原始(非utf8)二进制数据。

在Go中,字符串是utf8:

in := "Good afternoon, or こんにちは"
buf := []byte(in)
str := base64.StdEncoding.EncodeToString(buf)
fmt.Println(str)
打印base64编码(ASCII安全)表示的:
r29vzcbhznlcm5vb24sig9yioobk+OCk+OBq+obeobrw==

JS字符串是UTF-16。因此,您需要从base64解码,并从utf8转换为utf-16。您可以使用库或助手函数,例如:

function b64DecodeUnicode(str) {
    return decodeURIComponent(atob(str).split('').map(function(c) {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
    }).join(''));
}

var str = "R29vZCBhZnRlcm5vb24sIG9yIOOBk+OCk+OBq+OBoeOBrw==";
var result = b64DecodeUnicode(str);
"Good afternoon, or こんにちは"

.

在Go中,字符串为UTF8:

in := "Good afternoon, or こんにちは"
buf := []byte(in)
str := base64.StdEncoding.EncodeToString(buf)
fmt.Println(str)
打印base64编码(ASCII安全)表示的:
r29vzcbhznlcm5vb24sig9yioobk+OCk+OBq+obeobrw==

JS字符串是UTF-16。因此,您需要从base64解码,并从utf8转换为utf-16。您可以使用库或助手函数,例如:

function b64DecodeUnicode(str) {
    return decodeURIComponent(atob(str).split('').map(function(c) {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
    }).join(''));
}

var str = "R29vZCBhZnRlcm5vb24sIG9yIOOBk+OCk+OBq+OBoeOBrw==";
var result = b64DecodeUnicode(str);
"Good afternoon, or こんにちは"

.

您的go代码是正确的。所以问题出在JS方面,你的go代码是正确的。那么问题出在JS方面。那么解决方案是什么呢?那么解决方案是什么呢?这适用于正确的UTF8字符串,所以我会将其标记为正确。不幸的是,它并没有解决我的问题,虽然它不在这里的范围内:我编码的数据是二进制的(加密的结果),我认为这里@colminator的注释可能适用于正确的UTF8字符串,所以我将它标记为正确的。不幸的是,它并没有解决我的问题,但这不在这里的范围之内:我编码的数据是二进制的(加密的结果),我认为这里@colminator的注释可能适用