将"=?UTF 8?"(RFC 2047)转换为golang中的常规字符串

Joh*_*ohn 5 string encoding utf-8 go

我正在使用API​​,它正在为其他语言文本返回这样的内容:

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

这是一种常见的格式吗?我如何将它转换为golang中的常规字符串?

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

rob*_*b74 7

很明显,您的API将返回以RFC 2047格式编码的数据.基本上,这定义了以下内容:

encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
Run Code Online (Sandbox Code Playgroud)

这意味着你的charset是UTF-8(非常方便,因为这是Go的本机字符集),你的编码是Base64.您必须解码的文本是"B?"之间的文本.和"?=".所以你要做的就是接受那个文字并打电话:

base64.StdEncoding.DecodeString(text)
Run Code Online (Sandbox Code Playgroud)

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

有一个decodeRFC2047Word()在功能net/mail包转到STDLIB,支持编码B和Q和字符集UTF-8,US-ASCII和ISO-8859-1.不幸的是它没有出口,但你可以随心所欲地从中获取灵感;)

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


Ale*_*Ale 5

从 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
}
Run Code Online (Sandbox Code Playgroud)

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