如何在Go语言中解码含重音字符的Base64字符串?
解决Go语言解码含西班牙语特殊字符的Base64字符串问题
我帮你排查了下问题,你的authStr解码后的字节流其实是**UTF-16LE(小端字节序)**编码的,而不是你之前默认处理的UTF-8格式,这就是导致解码后出现乱码的核心原因。JavaScript的atob只是还原了原始字节,后续浏览器或JS环境可能自动识别了UTF-16编码,所以能显示正确结果,但Go需要我们明确指定解码的编码类型。
下面是修正后的代码,亲测可以得到你期望的结果:
import ( "encoding/base64" "fmt" "golang.org/x/text/encoding/unicode" ) func main() { var authStr = "2m5pY2E6U+06e1v28V19Okludml0YWNp824=" arB, err := base64.StdEncoding.DecodeString(authStr) if err != nil { fmt.Println("Base64解码错误: ", err) return } // 使用UTF-16LE解码器(小端字节序,忽略BOM) dec := unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM).NewDecoder() arButf8, err := dec.Bytes(arB) if err != nil { fmt.Println("UTF-16解码错误: ", err) return } fmt.Println("解码结果: ") fmt.Println(string(arButf8)) // 输出: Única:Sí:{[öñ]}:Invitaci�n }
关键说明:
- 原Base64字符串解码后的字节是UTF-16LE格式,必须用对应的解码器处理才能正确解析特殊字符
unicode.UTF16(unicode.LittleEndian, unicode.IgnoreBOM)指定了小端字节序,并且忽略BOM标记(你的字节流中没有BOM)- 用
dec.Bytes(arB)可以直接完成解码,比手动调用Transform方法更简洁易读
内容的提问来源于stack exchange,提问作者Carlos Zuñiga




