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

时间:2016-12-01 08:11:01

标签: email go unicode utf-8 html-email

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

根据此stackoverflow答案,由于UTF-8编码,解码后应转换为00A0(nbsp):https://stackoverflow.com/a/2774507

然而,在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链接:https://play.golang.org/p/8n6L7dlZPt

而不是在那里使用NBSP,它将保留\ xC2并导致“文本文本文本只是两个空格”。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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

相关问题