如何解码 base64 字符串并获取正确的字符,包括重音符号?

Posted

技术标签:

【中文标题】如何解码 base64 字符串并获取正确的字符,包括重音符号?【英文标题】:How to decode base64 string and get the correct characters including the accents? 【发布时间】:2018-11-01 10:53:49 【问题描述】:

我必须用 golang 解码一个包含西班牙语单词、重音符号和特殊字符的字符串。但是我尝试过的不起作用。你能否引导我走上正确的道路,得到我需要的东西。提前致谢。这是我当前的代码:

import (
    "encoding/base64"
    "fmt"

    "golang.org/x/text/encoding/unicode"
)

    var authStr = "2m5pY2E6U+06e1v28V19Okludml0YWNp824="
    arB, _ := base64.StdEncoding.DecodeString(authStr)
    fmt.Println("De arB se obtuvo: ")
    fmt.Println(string(arB)) 
    // got->        �nica:S�:[��]:Invitaci�n
    // expected->   Única:Sí:[öñ]:Invitación
    dec := unicode.UTF8.NewDecoder()
    arButf8 := make([]byte, len(arB)*2)
    if n, _, err := dec.Transform(arButf8, []byte(arB), true); err != nil 
        fmt.Println("Error: ", err)
     else 
        arButf8 = arButf8[:n]
        fmt.Println("De authStr se obtuvo: ")
        fmt.Println(string(arButf8)) 
        // got->        �nica:S�:[��]:Invitaci�n
        // expected->   Única:Sí:[öñ]:Invitación          
    
    // If do with javascript atob("2m5pY2E6U+06e1v28V19Okludml0YWNp824=") works fine

【问题讨论】:

您的 base64 编码字符串错误:play.golang.org/p/F8yG_0dyvun。编码字符串w5puaWNhOlPDrTp7W8O2w7FdfTpJbnZpdGFjacOzbg== 正确解码为Única:Sí:[öñ]:Invitación 源字符串采用8859-1 或Windows-1252 编码,而不是程序所期望的UTF-8。使用x/net/encoding 将字符串转换为UTF-8 也许你是对的,但是字符串是浏览器发送的: atob("2m5pY2E6U+06e1v28V19Okludml0YWNp824=") btoa("Única:Sí:[öñ]:Invitación ") 还有其他想法吗? #ThunderCat 有权利。我只是改变了这条线,一切正常。谢谢:dec := charmap.ISO8859_1.NewDecoder() 【参考方案1】:

这是正确的代码:

    import (
     "encoding/base64"
     "fmt"
     "golang.org/x/text/encoding/charmap"
    )
    var authStr = "2m5pY2E6U+06e1v28V19Okludml0YWNp824="
    arB, _ := base64.StdEncoding.DecodeString(authStr)
    fmt.Println("De arB se obtuvo: ")
    fmt.Println(string(arB)) 
    dec := charmap.ISO8859_1.NewDecoder()
    arBdest := make([]byte, len(arB)*2)
    if n, _, err := dec.Transform(arBdest, []byte(arB), true); err != nil 
        fmt.Println("Error: ", err)
     else 
        arBdest = arBdest[:n]
        fmt.Println("De authStr se obtuvo: ")
        fmt.Println(string(arBdest))         
    

【讨论】:

以上是关于如何解码 base64 字符串并获取正确的字符,包括重音符号?的主要内容,如果未能解决你的问题,请参考以下文章

使用Javascript的atob解码base64不能正确解码utf-8字符串

Base64 解码 - 不正确的字符串长度

尝试在已用 Java 编码的 JS 中解码 Base64 时出现“要解码的字符串未正确编码”错误

如何使用 SQL/T-SQL 正确地对扩展字符集进行 Base64 编码

如何解码 base64 编码的字符串?

如何使用颤振将 Base64 字符串解码为图像文件