在golang中将"=?UTF 8?.."(RFC 2047)转换为普通字符串

6

我正在使用API,它返回其他语言文本的结果格式如下:

=?UTF 8?B?2KfZhNiu2LfZiNin2Kog2KfZhNiq2Yog2KrYrNmF2Lkg2KjZitmG?= =?UTF 8?B?INit2YHYuCDYp9mE2YLYsdin2ZPZhiDYp9mE2YPYsdmK2YUg2YjZgQ==?= =?UTF 8?B?2YfZhdmHINmF2YXYpyDYp9mU2YXZhNin2Ycg2KfZhNi52YTYp9mF?= =?UTF 8?B?2Kkg2LnYqNivINin2YTZhNmHINin2YTYutiv2YrYp9mGLnBkZg==?=

这是一种常见的格式吗?我该如何在Golang中将其转换为普通字符串?

Golang通常很好地处理多种语言,但我不确定如何进行转换。

2个回答

9
自 Go 1.5 版本以来,您可以使用 mime.WordDecoder.DecodeHeader
package main

import (
    "fmt"
    "mime"
)

func main() {
    dec := new(mime.WordDecoder)
    header, err := dec.DecodeHeader("=?UTF-8?B?2KfZhNiu2LfZiNin2Kog2KfZhNiq2Yog2KrYrNmF2Lkg2KjZitmG?= =?UTF-8?B?INit2YHYuCDYp9mE2YLYsdin2ZPZhiDYp9mE2YPYsdmK2YUg2YjZgQ==?= =?UTF-8?B?2YfZhdmHINmF2YXYpyDYp9mU2YXZhNin2Ycg2KfZhNi52YTYp9mF?= =?UTF-8?B?2Kkg2LnYqNivINin2YTZhNmHINin2YTYutiv2YrYp9mGLnBkZg==?=")
    if err != nil {
        panic(err)
    }
    fmt.Println(header)
    // Output: لخطوات التي تجمع بين حفظ القرآن الكريم وفهمه مما أملاه العلامة عبد الله الغديان.pdf
}

如果您使用的是较旧版本的Go,您可以使用我的替代库:https://github.com/alexcesaro/quotedprintable

8
显然,你的API返回的数据以RFC 2047格式编码。基本上,这定义如下:
encoded-word = "=?" charset "?" encoding "?" encoded-text "?="

这意味着您的字符集是UTF-8(非常方便,因为这是Go的本地字符集),而您的编码是Base64。您需要解码的文本位于“B?”和“?”之间。因此,您只需获取该文本并调用:
base64.StdEncoding.DecodeString(text)

获取原始的UTF-8字符串。

在Go stdlib的net/mail包中有一个decodeRFC2047Word()函数,支持编码BQ以及字符集UTF-8US-ASCIIISO-8859-1。不幸的是它没有被导出,但你可以从中获得灵感。

顺便提一句:我刚刚注意到你示例字符串中的字符集是UTF 8,这有点奇怪,因为该编码的官方名称是UTF-8


它有破折号,但在我的处理步骤中被删除了。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接