You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动