当您在 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 并生成“Text Text Text That's just two spaces”。
将其正确呈现为\x00A0 的最佳方法是什么?
最佳答案
正如 Volker 在他的评论中所解释的那样,Go 字符串只是一个 byte slice 段。在您的情况下,它已经编码为 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 格式了。
关于email - 在 Golang 中解码引用可打印的电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40905551/