将“=?UTF 8?..”(RFC 2047)转换为golang中的常规字符串
Converting "=?UTF 8?.." (RFC 2047) to a regular string in golang
我正在使用 API,它为其他语言文本返回类似这样的内容:
=?UTF 8?B?2KfZhNiu2LfZiNin2Kog2KfZhNiq2Yog2KrYrNmF2Lkg2KjZitmG?= =?UTF 8?B?INit2YHYuCDYp9mE2YLYsdin2ZPZhiDYp9mE2YPYsdmK2YUg2YjZgQ==?= =?UTF 8?B?2YfZhdmHINmF2YXYpyDYp9mU2YXZhNin2Ycg2KfZhNi52YTYp9mF?= =?UTF 8?B?2Kkg2LnYqNivINin2YTZhNmHINin2YTYutiv2YrYp9mGLnBkZg==?=
这是通用格式吗?我将如何将其转换为 golang 中的常规字符串?
Golang 通常可以很好地处理多种语言,但我不确定如何进行转换。
显然您的 API 正在返回以 RFC 2047 format 编码的数据。基本上,这定义了以下内容:
encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
这意味着您的字符集是 UTF-8(非常方便,因为这是 Go 的本机字符集),并且您的编码是 Base64。您必须解码的文本是 "B?" 和“?=”之间的文本。所以你所要做的就是拿走那条短信并打电话:
base64.StdEncoding.DecodeString(text)
获取原始UTF-8字符串。
Go 标准库的 net/mail
包中有一个 decodeRFC2047Word()
函数,支持编码 B
和 Q
以及字符集 UTF-8
, US-ASCII
和 ISO-8859-1
。不幸的是,它没有导出,但您可以根据需要从中获取尽可能多的灵感 ;)
顺便说一句: 我刚刚注意到你的示例字符串中的字符集是 UTF 8
,这有点奇怪,因为编码的官方名称是 UTF-8
.
从 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
我正在使用 API,它为其他语言文本返回类似这样的内容:
=?UTF 8?B?2KfZhNiu2LfZiNin2Kog2KfZhNiq2Yog2KrYrNmF2Lkg2KjZitmG?= =?UTF 8?B?INit2YHYuCDYp9mE2YLYsdin2ZPZhiDYp9mE2YPYsdmK2YUg2YjZgQ==?= =?UTF 8?B?2YfZhdmHINmF2YXYpyDYp9mU2YXZhNin2Ycg2KfZhNi52YTYp9mF?= =?UTF 8?B?2Kkg2LnYqNivINin2YTZhNmHINin2YTYutiv2YrYp9mGLnBkZg==?=
这是通用格式吗?我将如何将其转换为 golang 中的常规字符串?
Golang 通常可以很好地处理多种语言,但我不确定如何进行转换。
显然您的 API 正在返回以 RFC 2047 format 编码的数据。基本上,这定义了以下内容:
encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
这意味着您的字符集是 UTF-8(非常方便,因为这是 Go 的本机字符集),并且您的编码是 Base64。您必须解码的文本是 "B?" 和“?=”之间的文本。所以你所要做的就是拿走那条短信并打电话:
base64.StdEncoding.DecodeString(text)
获取原始UTF-8字符串。
Go 标准库的 net/mail
包中有一个 decodeRFC2047Word()
函数,支持编码 B
和 Q
以及字符集 UTF-8
, US-ASCII
和 ISO-8859-1
。不幸的是,它没有导出,但您可以根据需要从中获取尽可能多的灵感 ;)
顺便说一句: 我刚刚注意到你的示例字符串中的字符集是 UTF 8
,这有点奇怪,因为编码的官方名称是 UTF-8
.
从 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