在 Golang 中解码引用可打印的电子邮件

Decoding quoted-printable email in Golang

当您在 Gmail 的 html 电子邮件中连续键入两个空格时,如果您查看电子邮件的来源,它会将其编码为可引用的可打印正文“=C2=A0”。

根据这个 Whosebug 答案,由于 UTF-8 编码,解码时应将其转换为 00A0 (n​​bsp):

然而,在 Golang 中,它不是这样工作的:

s := `Text Text Text.=C2=A0 That's just two spaces`

r := strings.NewReader(s)

qpReader := quotedprintable.NewReader(r)

all, _ := ioutil.ReadAll(qpReader)

str := string(all)

fmt.Println(strings.Index(str, "\xC2\xA0"))

输出“15”,这里是 Playground link:https://play.golang.org/p/8n6L7dlZPt

它不会在那里使用 NBSP,而是保留 \xC2 并导致 "Text Text Text That's just two spaces"。

将其正确呈现为 \x00A0 的最佳方法是什么?

正如 Volker 在他的评论中所解释的那样,Go 字符串只是一个字节片段。在您的情况下,它已经编码为 UTF-8,这是 Go 的默认编码。要访问实际的 Unicode 代码点(Go 术语中的 runes),请使用类似:

// Prints 15.
fmt.Println(strings.IndexRune(str, '\xA0'))

// Prints A0.
fmt.Printf("%X\n", []rune(str)[15]);

如何正确呈现字符串取决于您要在哪里呈现它。但在大多数情况下,您可以按原样传递它,因为它已经是 UTF-8 格式了。